常见开源消息系统

标签: 架构研究 Message queue 消息系统 消息队列 | 发表时间:2013-08-11 22:10 | 作者:Bruce Dou
出处:http://blog.eood.cn

消息系统的作用:异步处理、削减峰值、减少组件之间的耦合。

选择消息系统根据业务需要需要考虑以下几个方面:

  1. 是否持久化
  2. 吞吐能力
  3. 高可用
  4. 分布式扩展能力
  5. 兼容现有协议
  6. 易于维护
  7. 其他,如消息丢失和重复的处理
  8. 避免单点故障
  9. 负载均衡

常见消息系统协议:

  1. STOMP
  2. AMQP
  3. 类似 MEMCACHE 的协议
  4. HTTP
  5. 自定格式

1、2 是不错的可选开源组件:

1. Kafka/MetaQ: 广泛用于 Linkedin 内部 (类似有 Java 版本的国产 MetaQ)

由于优先考虑吞吐,更加适合大数据量的消息收集和处理,比如日志分析、用户行为信息实时报表、集群状态信息收集和分析。

  1. 优先考虑持久化的设计,依靠 page cache 管理内存
  2. 高吞吐 112MB/s 11K msgs/s (比 beanstalkd >70x 吞吐能力)
  3. 支持异步复制
  4. 高可用、基于 Zookeeper 的集群设计、支持消费者失效后重新负载均衡
  5. Kafka 提供 PHP 类库
  6. 支持 ganglia JMX 监控
  7. 需要策略避免重复消息, 消费者更新 Zookeeper 的 offset 的方式 (MetaQ 已经提供了几种方式避免消息重复)
  8. MetaQ 提供 HTTP 接口

http://www.mail-archive.com/kafka-users@incubator.apache.org/msg02082.html
https://github.com/neophenix/StateOfTheMQ/blob/master/state_of_the_mq.pdf?raw=true
http://s.urge.omniti.net/i/content/slides/Surge2012-ErikOnen_Kafka_Messaging-Paradigms.pdf
http://research.microsoft.com/en-us/um/people/srikanth/netdb11/netdb11papers/netdb11-final12.pdf
http://dirlt.com/kafka.html
http://dirlt.com/index.html
http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes

2. NSQ – Golang

无中心设计、节点自动注册和发现。可以考虑作为内部通讯框架的基础。

https://github.com/bitly/nsq
* 追求简单部署
* 追求高可用、避免单点故障、无中心设计
* 确保消息送达
* 生产者消费者自动发现、消费者连接所有生产者、向消费者推的模式
* 提供 HTTP 接口

https://speakerdeck.com/snakes/nsq-nyc-golang-meetup
https://github.com/davegardnerisme/nsqphp

http://www.davegardner.me.uk/blog/tag/nsq/

3. Beanstalkd

  1. 支持持久化 binlog 设计,重启消息不丢失
  2. 一般
  3. 无高可用设计
  4. 和 memcached 一样的分布式扩展方式
  5. 各种类库
  6. 有 Web 管理工具
  7. 支持同步调用,等待返回
  8. 只有类似 Memcache TCP ASCII 协议, 单文件部署
  9. 支持消息优先级
  10. 9K jobs/s 入队列 5K jobs/s 出队列
  11. 单点故障
  12. 无主从同步复制机制
  13. 最好单机多实例部署

https://github.com/kr/beanstalkd/wiki/Tools
https://github.com/pda/pheanstalk

4. Redis

需要自己封装 Pub/Sub

  • 基于 Redis 的复制高可用

其他常见开源消息系统:

ZeroMQ: 轻量级基础消息库

只适合不需要持久化的场景、需要自己封装

  1. 不支持持久化,只提供消息分发, 性能最好
  2. 无 Broker 设计, 无中心故障

RabbitMQ

  • 2500 job/s 入队列 1300 job/s 出队列
  • 适合小消息
  • 分布式无单点设计
  • 底层为 Erlang 实现
    有评论: RabbitMQ could not enqueue/dequeue fast enough.

https://blogs.vmware.com/vfabric/2013/04/how-fast-is-a-rabbit-basic-rabbitmq-performance-benchmarks.html

RESTMQ

http://restmq.com/

MemcacheQ

http://memcachedb.org/memcacheq/

HTTPSQS

https://code.google.com/p/httpsqs/

Gearman

http://gearman.org/presentations
https://code.google.com/p/shard-query/

Kestrel

http://robey.github.io/kestrel/
http://robey.github.io/kestrel/docs/guide.html

HornetQ

性能差不考虑[3]

Resque

3800 jobs/s 入队列 300 jobs/s 出队列
https://github.com/blog/542-introducing-resque
基于 Redis 的消息队列

Starling

https://github.com/starling/starling

SquirrelMQ

https://code.google.com/p/squirrel-message-queue/

Sparrow – Ruby

https://code.google.com/p/sparrow/

Apache ActiveMQ

ActiveMQ crashed constantly under load.

STOMP HTTP 协议

http://stomp.github.io/stomp-specification-1.2.html

参考:

http://hiramchirino.com/stomp-benchmark/ec2-c1.xlarge/index.html
https://blog.serverdensity.com/queueing-mongodb-using-mongodb/
[3] http://x-aeon.com/wp/2013/04/10/a-quick-message-queue-benchmark-activemq-rabbitmq-hornetq-qpid-apollo/
https://news.ycombinator.com/item?id=5531192
http://www.javaplex.com/blog/high-performance-message-queues-get-reviewed/
http://adam.heroku.com/past/2010/4/24/beanstalk asimple andfast queueingbackend/

相关 [常见 开源 消息] 推荐:

常见开源消息系统

- - Web 开发 : 从后端到前端
消息系统的作用:异步处理、削减峰值、减少组件之间的耦合. 选择消息系统根据业务需要需要考虑以下几个方面:. 其他,如消息丢失和重复的处理. 类似 MEMCACHE 的协议. 1、2 是不错的可选开源组件:. Kafka/MetaQ: 广泛用于 Linkedin 内部 (类似有 Java 版本的国产 MetaQ).

常见开源协议!【科普】

- So - 博客园-首页原创精华区
BSD开源协议是一个给于使用者很大自由的协议. 基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布. 但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议.

淘宝开源分布式消息中间件Metamorphosis

- - InfoQ cn
最近,淘宝开源了分布式消息中间件 Memorphosis项目,它是Linkedin开源MQ——Kafka的Java版本,针对淘宝内部应用做了定制和优化. 据了解,Metamorphosis(以下简称Meta)的设计原则包括:. 分布式,生产者、服务器和消费者都可分布. Metamorphosis的总体 架构图如下:.

[原]常见开源协议大白话说明

- - Dev in Nightmare
GPL:只要你用了任何该协议的库、甚至是一段代码,那么你的整个程序,不管以何种方式链接,都必须全部使用GPL协议、并遵循该协议开源. 商业软件公司一般禁用GPL代码,但可以使用GPL的可执行文件和应用程序. AGPL:即Affero GPL,是GPL的更严格版本. 只要你用了任何该协议的库、甚至是一段代码,那么运行时和它相关的所有软件、包括通过网络联系的所有软件,必须全部遵循该协议开源.

消息两则

- 藏书人 - 李志官方博客
1,经过深思熟虑,我放弃了十月份做个人小巡演的计划,全心全意投入跨年音乐会的准备工作. 如不出意外,12月31日南京见. 2,如果不出意外,第六张专辑会在十一之前发布. 经过深思熟虑,我决定不做实体,直接放到官网提供下载,能者多劳,愿者给钱. 3,当然对我而言,意外是常态.

周一消息树

- 水御龙神 - 1416 教室
每一个光鲜的封面,都饱含美术编辑的”血泪“和杂志主编的“阴谋”——今天的消息树让我们将掀开封面往里瞅瞅. 最新一期的美国新闻周刊封面,实在让人有点儿难以置信. 优雅的戴安娜王妃突然出现在二十一世纪的街头,旁边是她的儿媳妇Kate,但仔细看,她却不是当年的王妃,变老了,变丑了——这是新闻周刊编辑们想象中的一个五十岁的女人的样子.

对象的消息模型

- loudly - 酷壳 - CoolShell.cn
[ ———— 感谢 Todd 同学 投递本文,原文链接 ———— ]. 话题从下面这段C++程序说起,你认为它可以顺利执行吗. 试试的确可以顺利运行输出hello world,奇怪吗. 其实并不奇怪,根据C++对象模型,类的非虚方法并不会存在于对象内存布局中,实际上编译器是把Hello方法转化成了类似这样的全局函数:.

Nexus Prime 消息总汇

- tossking - 爱范儿 · Beats of Bits
Google 的每一个亲儿子都倍受瞩目,比如 Nexus One 登场时被冠以“Super Phone”的称号,而 Nexus S 的曝光是由施密特亲手操办的. 那么在今年会有新的 Nexus 手机发布吗. 现在的传言是:9 月或 10 月发布一款名为  Nexus Prime 的超强手机. 关于 Nexus Prime 手机的传言来源较广,但至少有三条可信度较高的消息:.