Go语言学习15 | 青训营笔记

62 阅读2分钟

这是我参加「第五届青训营」笔记创作活动的第15天

消息队列

消息队列(Message Queue)是分布式系统中的重要组件,其通用的使用场景为不需要立即获得结果,但是并发量有需要进行控制的时候。消息队列主要解决了应用耦合、异步处理、流量削峰的问题。

当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,二部分数据库例如Redis、Mysql以及phxsql也可以实现消息队列的功能。

消息队列使用场景

消息队列在实际应用中包括如下四个场景:

  • 应用耦合:多应用见通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
  • 异步处理: 多应用对消息队列中同一消息进行处理,应用见并发处理消息,相比穿行处理,减少处理时间;
  • 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
  • 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者负责对消息进行处理;

消息队列的缺点

系统可用性降低

原本A系统只需要调用BCD接口即可,BCD自己保证可用就行,现在引入消息队列作为桥梁,如果消息队列挂掉,系统就不可用了。

系统复杂度提高

加入消息队列,会引入一系列的问题:怎样保证消息不被重复消费?如果消息丢失怎么办?怎样保证消息的消费顺序?

一致性问题

当A系统把消息发送到消息队列,BCD去消费,BCD是否成功消费了消息是不可阈值的,有可能B消费成功了,而CD没有成功,这就造成了数据不一致的情况。