美文网首页
消息队列高手课 - 思维导图

消息队列高手课 - 思维导图

作者: 技术灭霸 | 来源:发表于2020-05-05 03:46 被阅读0次

消息生态系统全景图

下载.png image.png image.png
在消费的时候,为了保证消息的不丢失和严格顺序,每个队列只能串行消费,无法做到并发,否则会出现消费空洞的问题。那如果放宽一下限制,不要求严格顺序,能否做到单个队列的并行消费呢?如果可以,该如何实现?

答:维护一个offset抽象,offset由单个位置变成一个集合,集合中包含多个单个位置。类似多值信号量的机制

image.png
image.png image.png image.png image.png
在消费端是否可以通过批量消费的方式来提升消费性能?在什么样场景下,适合使用这种方法?或者说,这种方法有什么局限性?

批量消费有意义的场景要求:

  1. 要么消费端对消息的处理支持批量处理,比如批量入库
  2. 要么消费端支持多线程/协程并发处理,业务上也允许消息无序。
  3. 或者网络带宽在考虑因素内,需要减少消息的overhead。

批量消费的局限性:

  1. 需要一个整体ack的机制,一旦一条靠前的消息消费失败,可能会引起很多消息重试。
  2. 多线程下批量消费速度受限于最慢的那个线程
1. 网关如何接收服务端的秒杀结果?

如果发送消息失败,可以直接给 APP 返回秒杀失败结果,成功发送消息之后,线程就阻塞等待秒杀结果。这里面不可能无限等待下去,需要设定一个等待的超时时间。

  // 发消息
      producer.send(msg);
 
      // 等待后端处理
      synchronized(mutex) {
        mutex.wait(timeout);
      }
 
      // 查询秒杀结果
      Result result = results.remove(uuid);
 
image.png
如何实现单个队列的并行消费?

比如说,队列中当前有 10 条消息,对应的编号是 0-9,当前的消费位置是 5。同时来了三个消费者来拉消息,把编号为 5、6、7 的消息分别给三个消费者,每人一条。过了一段时间,三个消费成功的响应都回来了,这时候就可以把消费位置更新为 8 了,这样就实现并行消费。

如何保证消息的严格顺序?

主题层面是无法保证严格顺序的,只有在队列上才能保证消息的严格顺序。

如果说,你的业务必须要求全局严格顺序,就只能把消息队列数配置成 1,生产者和消费者也只能是一个实例,这样才能保证全局严格顺序。

大部分情况下,我们并不需要全局严格顺序,只要保证局部有序就可以满足要求了。

image.png image.png image.png image.png

相关文章

网友评论

      本文标题:消息队列高手课 - 思维导图

      本文链接:https://www.haomeiwen.com/subject/wuhpghtx.html