消息系统分类
Peer-to-Peer(点对点,往往是单播)
一般基于pull或者polling接收消息
发送队列中的消息被一个且只有一个接收者所接收,即使有多个消费者在监听同一个队列
既可以支持异步“ 即发即弃 ”的消息发送方式,也可以支持同步请求/应答的消息发送方式(即等到消费者成功返回之后再发送下一条消息)
发布/订阅
发布到一个主题的消息,可以被多个订阅者接收
发布/订阅即可基于Push消费数据,也可以基于Pull或者Pollinig的方式消费数据
解耦能力比P2P模式更强
KafKa消息系统类型
kafka是同时支持单播和多播的,kafka可以有不同的consumer-group,kafka支持不同消费者组之间的多播,每个consumer-group都会有consumer接收这条消息,也支持在group中的单播,在group中只会有一个consumer消费这条消息。
消息系统的适用场景
解耦
各个系统之间通过消息系统这个统一的接口交换数据,不用关心有哪些系统需要处理以及如何处理这条消息。
冗余
部分消息系统具有消息持久化的能力(如KafKa),可以规避消息处理前丢失的风险
扩展
消息系统是统一的数据接口,各系统可以独立扩展,不需要感知彼此间的变化
峰值处理能力
消息系统可以顶住峰值流量,系统可以根据自身的处理能力从消息系统中获取定量的请求进行处理,这样就可以在流量高峰期不会导致系统崩溃,也不会因为为了要应对流量高峰期而升级所带来的资源的浪费
可恢复性
系统中部分组件失效并不会影响整个系统,当它恢复后仍可以从消息系统中获取消息进行处理
异步通信
在不需要立即对请求做出处理时,可以将请求放入到消息系统中,在适当的时候从消息系统中取出再进行处理
常用消息系统对比
RabbitMq
基于Erlang编写的,支持多协议:AMQP(语言无关), XMPP, SMTP, STOMP,支持负载均衡,数据持久化,同时支持P2P和发布/订阅模式,但是比较的重量级,适合在较为重量型的企业应用中
Redis
支持MQ功能,可以做轻量级队列服务使用,就入队而言,Redis对于短消息(小于10KB)的性能要比RabbitMq好,但是长消息的性能比RabbitMq差
ActiveMq
JMS实现,P2P点对点模式,支持持久化,支持XA事务
Kafka
高性能跨语言的分布式发布/订阅消息系统,支持数据持久化,全分布式,同时支持在线和离线的处理
RocketMq
纯Java实现,发布/订阅消息系统,支持本地事务和分布式XA事务