消息生态系统全景图



在消费的时候,为了保证消息的不丢失和严格顺序,每个队列只能串行消费,无法做到并发,否则会出现消费空洞的问题。那如果放宽一下限制,不要求严格顺序,能否做到单个队列的并行消费呢?如果可以,该如何实现?
答:维护一个offset抽象,offset由单个位置变成一个集合,集合中包含多个单个位置。类似多值信号量的机制





在消费端是否可以通过批量消费的方式来提升消费性能?在什么样场景下,适合使用这种方法?或者说,这种方法有什么局限性?
批量消费有意义的场景要求:
- 要么消费端对消息的处理支持批量处理,比如批量入库
- 要么消费端支持多线程/协程并发处理,业务上也允许消息无序。
- 或者网络带宽在考虑因素内,需要减少消息的overhead。
批量消费的局限性:
- 需要一个整体ack的机制,一旦一条靠前的消息消费失败,可能会引起很多消息重试。
- 多线程下批量消费速度受限于最慢的那个线程
1. 网关如何接收服务端的秒杀结果?
如果发送消息失败,可以直接给 APP 返回秒杀失败结果,成功发送消息之后,线程就阻塞等待秒杀结果。这里面不可能无限等待下去,需要设定一个等待的超时时间。
// 发消息
producer.send(msg);
// 等待后端处理
synchronized(mutex) {
mutex.wait(timeout);
}
// 查询秒杀结果
Result result = results.remove(uuid);

如何实现单个队列的并行消费?
比如说,队列中当前有 10 条消息,对应的编号是 0-9,当前的消费位置是 5。同时来了三个消费者来拉消息,把编号为 5、6、7 的消息分别给三个消费者,每人一条。过了一段时间,三个消费成功的响应都回来了,这时候就可以把消费位置更新为 8 了,这样就实现并行消费。
如何保证消息的严格顺序?
主题层面是无法保证严格顺序的,只有在队列上才能保证消息的严格顺序。
如果说,你的业务必须要求全局严格顺序,就只能把消息队列数配置成 1,生产者和消费者也只能是一个实例,这样才能保证全局严格顺序。
大部分情况下,我们并不需要全局严格顺序,只要保证局部有序就可以满足要求了。




网友评论