首页 > *nix应用编程, *nix技术 > 消息队列

消息队列

2020年3月15日 发表评论 阅读评论 347 次浏览

如果两/多个系统之间要进行同步协作,RPC(远程过程调用)可能是首选方案。但如果是异步协作,那么MQ(消息队列)也许更有吸引力,因为相比RPC提供的异步调用功能,MQ具备更多的优秀特性。
MQ与RPC的不同点在于可以存储消息(以及Broker,即消息转发器),因此MQ除了可以对消息相关的两/多方进行解耦之外,还有如下特点:

1,异步:MQ具备天然的异步特性,消息发送方和接收方都只需关注消息本身即可,无需过多考虑对端的情况。
2,可靠投递:消息存于MQ里,例如接收方可以反复读取,直到成功处理为止,并且通过ACK机制进行消费确认。
3,多播/广播:可以有多个接收方读取同一个消息,还可以进行消息的订阅/发布。
4,流量削峰:MQ相当于一个消息的蓄水池,处理不完的消息暂存在MQ里,不会冲爆消息接收方,也就是类似于流量控制的作用。
5,事务处理:通过记录补偿,本地事务,本地落地,补偿发送等多种手段实现事务化处理。
6,可靠性:将消息持久化,实现宕机重启后,消息可以从持久化存储恢复,消息不丢失。
7,高可用性:支持集群。

以上这些特点可以给系统带来各种好处,比如解耦、性能、吞吐、健壮性、最终一致性等方面都得到提升。

社区有很多优秀的MQ开源,目前主流使用的有:
1,Kafka
http://kafka.apache.org/
Apache社区开源的MQ产品,可用于系统间的数据流管道,实时数据处理,因此在大数据领域的实时计算以及日志采集被应用较多,依赖Zookeeper一起使用。使用Scala语言开发,社区活跃度和文档完备性都非常高,客户端语言支持C/C++、Python、Go、Erlang、.NET、Ruby、Node.js、PHP等。

2,RocketMQ
http://rocketmq.apache.org/
Alibaba开发的MQ产品,目前已加入到Apache下,主要用于非日志的可靠消息传输。例如:订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等。使用Java语言开发,客户端语言目前支持Java、C/C++、Python、Go等。

3,Redis5.0+
https://redis.io/
Redis5.0新增了一个数据结构Stream,可以用来实现典型的消息队列。Redis作者坦言Stream狠狠的借鉴了Kafka的设计,并且Redis作者在很久之前就开发过一个分布式消息队列Disque,由于有众多经验在前,那么这个消息队列Stream应该不至于很差。Redis比较常用,很多应届生或初学者都会学习Redis,其本身使用C语言开发,支持的客户端语言众多,安装部署使用都会更加简单。

总的来说,如果业务偏向于大数据或日志处理,可以选用Kafka。
如果业务偏向于电商类,可以考虑RocketMQ。
如果想要更加轻量级的MQ,特别是如果业务系统里已经有Redis的应用,那么不妨试试Redis5.0+里的Stream。

转载请保留地址:http://www.lenky.info/archives/2020/03/2727http://lenky.info/?p=2727


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.