消息队列的使用和注意事项

使用消息队列我们要搞清楚一下几个问题:

  1. 为什么使用消息队列?
  2. 使用消息队列有什么缺点?
  3. 消息队列如何选型?
  4. 如何保证消息队列是高可用的?
  5. 如何保证消息不被重复消费?
  6. 如何保证消费的可靠性传输?
  7. 如何保证消息的顺序性?

1.使用消息队列可以达到几个目的:解耦、异步、削峰

解耦:系统间耦合性太强,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

异步:一些非必要的业务逻辑以同步的方式运行,太耗费时间。将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快相应速度

削峰:

传统模式的缺点:

  • 并发量大的时间,所有的请求直接怼到数据库,造成数据库连接异常

中间件模式的优点:

  • 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

2.使用消息队列会有的缺点

  • 系统可用性降低:你想呀,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低
  • 系统复杂性增加:加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,刺痛复杂性增大。

3.消息队列的选择:

4.如何保证消息队列的高可用

5.如何保证消息不被重复消费

如何保证消息不被重复消费的前提是我们必须要知道是什么原因导致了消息被重复消费:网络传输等等故障,确认信息没有传送到消息队列(消息队列不清楚是否被消费再次将消费发给消费者)

如何解决这个问题呢?

(1)比如,你拿到这个消息做数据库的insert操作,那就容易了,给这个消息做一个唯一的主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。

(2)再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。

(3)如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis.那消费者开始消费前,先去redis中查询有没有消费记录即可。

6.如何保证消费的可靠性传输?

  • 生产者弄丢数据
  • 消息队列弄丢数据
  • 消费者弄丢数据

猜你喜欢

转载自www.cnblogs.com/wwwcf1982603555/p/12767501.html