存档

文章标签 ‘RocketMQ’

消息队列

2020年3月15日 没有评论 350 次浏览

如果两/多个系统之间要进行同步协作,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。 ... [阅读更多]