消息队列

消息队列的使用场景

  1. 异步处理,比如用户注册后需要发送注册邮件或者注册短信,可以将发送邮件消息放到消息队列再异步去处理,用户就不需要等到发送完才返回注册响应,提高了响应速度。
  2. 应用解耦,比如订单系统和库存系统之间使用消息队列进行解耦,避免了库存系统故障而导致订单也无法完成的严重错误。
  3. 流量削锋,比如秒杀活动,大量用户请求涌进,服务器接收后写入消息队列。假如消息队列消息的长度超过最大数量,则直接抛弃用户请求或者跳转到错误页面。业务部分再根据消息队列中的请求做后续的处理。
  4. 消息通讯,比如实现点对点消息队列,或者聊天室等。
  5. 日志处理,比如Kafka,解决大量日志传输的问题,日志采集客户端负责日志的采集,定时写入消息队列;Kafka再负责日志数据的接收、存储和转发。

消息的重发补偿解决思路

  • 参考这里

消息的幂等性解决思路

  • 参考这里

消息的堆积解决思路

  • 增大批次:瓶颈在消费吞吐量的时候,增加批次也可以改善性能
  • 增加线程数:如果一些消费者组中的消费者线程还是有 1 个消费者线程消费多个分区的情况,建议增加消费者线程。尽量 1 个消费者线程对应 1 个分区,从而发挥现有分区数下的最大并行度。

自己如何实现消息队列

  • 参考生产者消费者模式

如何保证消息的有序性

  • 拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;或者就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

你可能感兴趣的:(Java知识大全)