最近在项目中实践RabbitMQ,比较幸运现在除了官方网站,还有一本非常棒的书可以读:RabbitMQ in Action;这本书目前还没有中文版或者影印版,但是从网上很容易找到PDF版本和epub mobi的版本.RabbitMQ上有关于这本书的介绍文章.从本文开始我会陆续把学习实践过程中的收获记录分享出来.

What is RabbitMQ?

  • Robust messaging for applications
  • Easy to use
  • Runs on all major operating systems
  • Supports a huge number of developer platforms
  • Open source and commercially supported

What for?

从概念上讲,RabbitMQ解决的是应用程序之间互联(connect)和规模(scale)的问题,消息发送和接收是隔离,发送方不知道消息最终由谁接收,接收方也不必关心消息是谁步发出的;发送和接收是隔离的,消息本质上就是异步的.这种隔离也就解耦了应用程序之间的依赖.RabbitMQ的角色就是应用程序中间的路由器.

规模(scale),应用程序解除了相互依赖之后从业务层面更容易做扩展,而Erlang的先天优势让代码层面的开发也更容易.

Why RabbitMQ?

摘录两段吧,第一段来自<RabbitMQ in Action>,第二段来自那篇很有名的<Rabbits and warrens>(后面我们还会提到它):

 [第一段]

Today, RabbitMQ isn’t the only game in town for open messaging. Options like ActiveMQ, ZeroMQ, and Apache Qpid all providing different open source approaches to message queuing. The question is, why do we think you should pick RabbitMQ?

  • Except for Qpid, RabbitMQ is the only broker implementing the AMQP open standard.
  • Clustering is ridiculously simple on RabbitMQ because of Erlang.
  • Your mileage may vary, but we’ve found RabbitMQ to be far more reliable and crash resistant than its competitors.
  • Perhaps the most important reason is that RabbitMQ is incredibly easy to install and use. Whether you need a simple one-node setup for your workstation, or a seven server cluster to power your web infrastructure, RabbitMQ can be up and running in about 30 minutes. With that in mind, it’s about time we fired up the little critter.

 

[第二段]

Cutting to the chase, over the last 4 years there have been no shortage of open-source message queueing servers written. Most of them are one-offs by folks like LiveJournal to scratch a particular itch. Yeah, they don’t really care what kind of messages they carry, but their design parameters are usually creator-specific (and message persistence after a crash usually isn’t one of them). However, there are three in-particular, that are designed to be highly flexible message queues for their own sake:

  • Apache ActiveMQ
  • ZeroMQ
  • RabbitMQ

Apache ActiveMQ gets the most press, but it appears to have some issues not losing messages. Next.

ZeroMQ and RabbitMQ both support an open messaging protocol called AMQP. The advantage to AMQP is that it’s designed to be a highly-robust and open alternative to the two commercial message queues out there (IBM and Tibco). Muy bueno. However, ZeroMQ doesn’t support message persistence across crashes reboots. No muy bueno. That leaves us with RabbitMQ. (That being said if you don’t need persistence ZeroMQ is pretty darn interesting…incredibly low latency and flexible topologies).

Why Erlang?

RabbitMQ的设计目标是实现开源版本的AMQP,在RabbitMQ在设计之初,两位设计者对于使用Erlang能否达到预期目标提出了三个关键问题:

  1. Would large financial institutions care whether their messaging broker was written in Erlang?

  2. Was Erlang really a good choice for writing an AMQP server?

  3. If it was written in Erlang, would that slow down adoption in the open source community?

即:大金融机构是否在意选择Erlang作为消息broker的开发语言;Erlang是否是开发AMQP服务的合适之选;使用Erlang,开源社区是否能够快速的接受.这三个问题的解答很有意思,首先金融公司表示他们不在意用什么语言开发只要能帮助他们减少集成成本即可;第二个问题Erlang Solutions公司的Francesco Cesarini (这位就是著名的袋鼠书的作者之一)给出了的解答:他分析了AMQP的协议,协议规格说明里面描述的架构遍布电话交换机系统,而Erlang就是起源于电信行业(点击维基百科了解Erlang),是针对电信领域的做的设计,这个在Joe Armstrong的论文中也有详细的背景介绍,所以Erlang几乎是构建AMQP Broker的不二之选.

最后一个问题的验证需要相当长的时间,这个已经由另外一个产品来验证了:ejabberd.ejabberd实现了即时消息通信协议XMPP协议,XMPP(Extensible Messaging and Presence Protocol).ejabberd被广泛使用,并没有负面的消息爆出.所以第三个问题也侧面得到了回答.

其实这里还可以补充两条Erlang的优势:相比其他语言构建集群简单,崩溃恢复容易.这两点可以说是Erlang与生俱来的优势.

Who Use MQ

列举几个使用消息队列的产品(不一定是使用RabbitMQ哦),slideshare上的信息更多一些,可惜被ping了,这里只罗列几个国内的:

首先必须是淘宝,淘宝数据库研发组的资料共享太给力了: http://mysql.taobao.org/index.php/Rabbitmq

  • 构建可扩展微博架构  http://wenku.baidu.com/view/6cba78cda1c7aa00b52acbc2.html

  • 米聊服务器的技术选型和架构设计 http://wenku.baidu.com/view/c51d700cf78a6529647d53e8.html

  • 虎扑网架构升级之路 http://wenku.baidu.com/view/e6992701de80d4d8d15a4fc9.html

  • 又拍网架构中的消息 http://wenku.baidu.com/view/c35c99d86f1aff00bed51e57.html

  • 豆瓣网技术架构 http://wenku.baidu.com/view/c569e45c3b3567ec102d8a26.html

    虎扑网的分享

    InfoQ:为什么选择了RabbitMQ作为消息服务器?我们知道RabbitMQ是ERLang语言编写了,在实际使用的过程中是否对RabbitMQ进行了集群,是否需要进行扩展开发?如果需要扩展开发,你们采用了哪种语言?我们知道RabbitMQ支持多种语言..

    洪涛:其实我们对消息队列的需求还是比较高的,一共有5点:一是能够提供多种消息分法的规则以匹配我们不同的业务类型,二是性能要高,三是需要支持多种语言的类库以便做接入,四是提供持久化,五是需要在未来支持集群。而同时满足这几个条件的成熟的消息队列系统其实并不多,RabbitMQ是其中之一。另一个原因是我在之前公司工作时有一位来自乌拉圭的同事对RabbitMQ很有研究,当时经常和他讨论消息队列方面的问题,所以在众多消息队列中,对RabbitMQ比较熟悉,也对它比较认可,使用它作为消息队列自然也就不奇怪了。补充一句,这位同事叫Alvaro Videla,他是市面上唯一一本RabbitMQ方面的书《RabbitMQ in Action》的作者之一,对消息队列很有研究,我的很多经验都来自和他的交流。

    消息队列能够将业务逻辑解耦,调用方只需要下达命令而不用等待整个逻辑执行完毕。除此之外消息队列也可以抑制性能波峰的产生,在瞬时业务增长产生时保持性能曲线的平滑。

How to Install

RabbitMQ的安装非常简单,下载源码包之后编译即可,很多脚本都可以在scripts文件夹里面找到,简单给出一个在centos环境下的安装示例:

 yum install libxslt python zip unzip nc -ywget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.7/rabbitmq-server-2.8.7.tar.gztar xfvz rabbitmq-server-2.8.7.tar.gz cd  rabbitmq-server-2.8.7make

如果你还没有安装Erlang,那么参考这里:[Erlang 0004] Centos 源代码编译 安装 Erlang 记得使用Erlang最新版本哦,晚安各位!

2013-06-06 更新 有朋友问.net开发者如何比较"优雅"的构造Rabbit消息,除了使用Json/XML这种文本消息结构之外,我们还可以使用二进制序列化

  public static class SerializationHelper{public static byte[] ToByteArray<T>(this T t){using (var memoryStream = new MemoryStream()){BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(memoryStream, t);return memoryStream.ToArray();}}public static object FromByteArray(byte[] data){using (MemoryStream stream = new MemoryStream()){stream.Write(data, 0, data.Length);stream.Position = 0;BinaryFormatter formatter = new BinaryFormatter();return formatter.Deserialize(stream);}}}[Serializable]public class RequestMessage{public int Id { get; set; }public string Request { get; set; }public override string ToString(){return string.Format("Id: {0} Request: '{1}'", Id, Request);}}[Serializable]public class ReplyMessage{public int Id { get; set; }public string Reply { get; set; }public override string ToString(){return string.Format("Id: {0} Reply: '{1}'", Id, this.Reply);}}

  

小图一张

[Erlang 0079] RabbitMQ 初探相关推荐

  1. RabbitMq初探——安装

    rabbitmq Server安装 rabbitmq server安装很简单. 安装erlang环境 rpm -ihv erlang-18.1-1.el6.x86_64.rpm rpm -ihv ra ...

  2. erlang与rabbitmq下载(Window)

    erlang与rabbitmq下载 官网下载: erlang官网下载 rabbitmq官网下载 附erlang24.1 与rabbitmq 3.9.8 安装包 链接:https://pan.baidu ...

  3. Ubuntu20安装erlang和rabbitmq

    版本:rabbitmq 3.8.15-1,erlang 22.1(root用户下安装,非root自行添加sudo命令) 由于版本对应和依赖的问题折腾很久,故此记录下来. 一.需要Erlang环境支持 ...

  4. Mac 下erlang及rabbitmq安装

    目录 一.linux下 二.mac下erlang.rabbitmq 1.首先,安装[Homebrew](https://brew.sh/index_zh-cn) 2.安装erlang环境 3.安装ra ...

  5. 解决escript: exception error: undefined function rabbitmqctl_escript:main/1问题以及如何安装Erlang和RabbitMq

    文章目录 1. 复现问题 2. 分析问题 3. 解决问题 4.如何安装Erlang和RabbitMq 1. 复现问题 今天在安装Erlang和RabbitMq完成后,在cmd窗口中输入如下命令: ra ...

  6. 2021-07-13 安装ERLANG 以及 RabbitMQ时遇到的版本不兼容异常

    今天安装ERLANG 以及 RabbitMQ时,遇到了一些问题. 在命令行执行安装插件的命令:rabbitmq-plugins enable rabbitmq_management 出现了错误如下: ...

  7. 安装Erlang和RabbitMQ详细教程

    安装Erlang OTP和RabbitMQ 1.RabbitMQ简介 2.基本概念 2.1.RabbitMQ服务支持下列操作系统: 2.2.RabbitMQ支持下列编程语言: 2.3.主要特性 2.4 ...

  8. RabbitMQ初探--用C#简单实现通信服务

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 消息传递指的是程序之 ...

  9. windows系统erlang和rabbitMQ安装教程(附网盘下载地址)

    rabbitMQ依赖于erlang,所以安装rabbitMQ之前需要先安装erlang,而他们之间的版本是有对应的,不同版本的rabbitMQ需要对应不同版本的erlang,如下图 官方下载这两个包是 ...

最新文章

  1. Android Framework学习总结
  2. 关于前端使用JavaScript无法实现canvas打印问题的解决
  3. 需求又变了,要不要怼回去?
  4. C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别
  5. 【Floyed】小萨的烦恼(ssl 1624)
  6. [渝粤教育] 广东-国家-开放大学 21秋期末考试财政学10573k1
  7. 【CodeForces - 1197C】Array Splitting(水题)
  8. android与js交互
  9. web api、获取DOM元素的方式、事件理解、click事件在移动端300ms延时、事件对象、事件委托、常见事件类型
  10. mysql 8 强制修改密码_Mysql 8.0版本强制无密码进入+更改密码
  11. Konomi与去中心化借贷协议bZx合作推动DeFi生态发展
  12. 设计模式:模板(Template)模式
  13. vim 命令模式下光标移动
  14. Laya ui 控件
  15. UINO优锘:深度|扒一扒图化资源申请之三生三世那点事儿
  16. 金蝶服务器修改ip,金蝶客户端修改服务器ip地址
  17. 数学和计算机竞赛,数学类和计算机类竞赛有哪些??
  18. 安装Altera USB-Blaster驱动程序遇到的问题
  19. 微信小游戏之飞机大战解析
  20. zbrush是什么软件

热门文章

  1. 【转载】中国煤层气资源量
  2. VB 全局Hook鼠标消息
  3. VB删除带子文件夹和文件的文件夹
  4. 反装逼指南:掀起机器学习的神秘面纱
  5. C/C++ assert()函数用法总结
  6. 再见Windows C++
  7. LINQ简记(3):子句
  8. ASP.NET--窗体实现淡入淡出效果
  9. aspx页面中文汉字显示为乱码
  10. React-Router4按需加载