消息中间件的主要作用
- 异步 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。
- 解耦 生产者系统将消息写入消息队列,消费系统自己从消息队列中获取消息,使得2个系统不再耦合。
- 削峰 有时一个系统的某个接口会有很大的流量,这种会给系统造成很大压力,服务器利用率则会偏高,而利用消息中间件,可以把高峰时的流量冲击放进消息队列中,消费者再慢慢消费。
消息队列的缺点
系统可用性降低 我们需要维护MQ,MQ也可能挂掉,系统的可用性是不是就降低了
系统的复杂度提高 加入一个MQ之后,需要考虑消息重复消费、消息丢失、甚至消息顺序性等问题
消息队列需要关注的几个点
死信队列 因为消息可能失败比如:消息被拒绝、TTL过期、队列达到最大长度等,所以为了保证消息都被消费,我们需要设计死信队列,我们系统可以设置一个线程,监控系统是否恢复正常,如果正常,就从死信队列再取数据消费
保证消息的可靠性 可分为生产者到消息队列,消息队列到消费者,生产者到消息队列可靠性可以发送数据前插入数据库,插入成功则标记。不过这种比较少用,影响效率。消息队列到消费者之间,可以对消息进行确认,直到消息被确认后,消息才会在队列里被删除
高可用 很多消息中间件都有对应的集群模式来实现高可用,比如RabbitMQ的高可用一般的做法都是开启镜像集群模式。
常见消息队列的对比
RabbitMq
适用范围:
- 您的应用需要使用 AMQP 0-9-1、STOMP、MQTT、AMQP 1.0 等现有协议的任意组合。
- 您需要确保消息交付成熟而且具有明确的一致性保障。
- 您的应用需要各种点-点、请求-应答和发布-订阅等通信模式。
- 到消费者的复杂路由,将多个服务或应用与重要的路由逻辑集成。
- 当与现有的 IT 基础架构集成非常重要时,RabbitMQ 非常合适。
kafka
适用范围:
- 从 A 到 B 的流传输,无需复杂的路由,最大吞吐量可达每秒 100k 以上,按分区顺序至少交付一次。
- 当您的应用需要访问数据流历史时,按分区顺序至少交付一次。Kafka 是一个持久性消息存储,客户端可以按需“重演”事件流,这与更为传统的消息代理不同;在更为传统的消息代理中,一旦消息完成交付,便会从队列中删除。
- 当您拥有能够可靠地跟踪日志偏移的智能客户端时。
- 如果您的应用需要一个“无限”队列。
参考
https://mp.weixin.qq.com/s/t0LOz_m3NH5y69VgSh7ayw
https://mp.weixin.qq.com/s/c-AbgNKKI2WEeMFyk4ZNYQ
https://mp.weixin.qq.com/s/l0AL89M0xPbWMFj6U7yYZw
欢迎关注公众号蜜蜂技术巢了解更多知识