主流消息中间件优劣:ActiveMQ,RabbitMQ,Kafka,RocketMQ
消息中间件
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
消息中间件应用场景
消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用更进一步的原因。
总结一下:
1.异步处理的时候,消息中间件简化耦合消息发送者和消费者消费者的耦合关系(类似ESB),当然也有一些辅助作用,比如联调简便、日志、排错等。
2.流量削峰,流控的时候,可以采用消息中间件做缓存,减少后端的压力。
消息中间件基本结构
PTP点对点
Pub/Sub发布订阅
消息中间件基本结构划分消息服务器、消息生产者、消息消费者、主体、队列和消息体5部分,大同小异,基本上这样划分,所以基本上使用过一种消息中间件的研发,其他也就会用了,只是再适用一下。
主流消息中间对比
随着云大物移的发展消息中间件也得到了长足发展,其分两类来源1.商业版2.开源版本 。在早些时候,国内这类中间件基本上都被国外商业版垄断,大家基本上都需要采购或盗版,但随着开源社区力量的发展,现在基本上大家都采用开源社区版或者是基于开源社区版定制的版本。
目前应用最广泛的消息中间件,kafka 功能强大,灵活度高,但是要想运营和维护好,就需要投入更多的技术运维,它自身仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 Kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。Kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略。Kafka天然适合大数据实时计算以及日志收集。
RocketMQ 开源参照kafka的设计思路,根据自身的需要自行研发并开源,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。 这个上手简单,但是灵活度不如kafka高,但是小公司和企业更建议应用,因为产品成熟度高,阿里只提供了MQ的核心能力,外围可以自由定制,特别适合小团队维护。
ActiveMQ是由Apache出品的一款开源消息中间件,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。ActiveMQ实现了JMS 1.1 并提供了很多附加的特性,比如JMX管理、主从管理、消息组通信、消息优先级、延迟接收消息、虚拟接收者、消息持久化、消息队列监控等。
RabbitMQ是一个由Erlang语言开发的基于AMQP标准的开源实现。RabbitMQ最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,RabbitMQ最大的优势在于提供了比较灵活的消息路由策略、高可用性、可靠性以及丰富的插件、多种平台支持和完善的文档。不过,由于AMQP协议本身导致它的实现比较重量,从而使得与其他MQ (比如Kafka) 对比其吞吐量处于下风。
个人建议
现在不管是企业数字化转型还是开发大型系统,一定要采用类似MQ中间件技术,减少日后变更带来的IT负债,至于选择是购买还是开源实现,取决于公司现状,如果要自研产品,肯定采用开源,如果是企业应用那可以开源社区或采购,主要取决于技术团队。
如果是云大物移的产品优选选择kafka ,确实功能,灵活性更加有利于日后发展和扩展,当然也取决于团队技术规模和实力。如果是小产品那建议Rocket。
如果是企业自身应用或者是采用,那还是Rocket,因为产品成熟,功能强大,汉语资料丰富,且需要较少的维护团队,直接拿来就可以用。