Skip to content

Latest commit

 

History

History
80 lines (54 loc) · 2.5 KB

队列.md

File metadata and controls

80 lines (54 loc) · 2.5 KB

消息队列

1.为什么用?

  • 异步,解耦,削峰。
  • 消息丢失:生产者丢失/队列丢失/消费者丢失
  • 消息重复:生产者重复,消费者重复
  • 架构问题,单点故障
  • 消息积压问题
  • 如何保证消息的顺序性问题?
  • 一致性问题,多个消费者,一个消息失败,其他消息成功该怎么办?

3.架构&原理&解决方案

3.1 NSQ

Q:NSQ消费者不丢失数据

  • 客户端表示它们可以接收消息
  • NSQ发送消息,暂时将消息存在本地
  • 客户端回复FIN 或者 REQ 表示成功或者重发。如果客户端未能及时发送,则NSQ将重复发送消息给该客户端。

Q:NSQ生产者不丢数据,NSQ队列不丢数据

  • 节点之间没有消息复制,所以即使多个节点部署,万一节点出现问题,还是有一段时间会出现消息无法接收到的情况,所以向多个节点同时发送消息也是一种解决方式
  • 消息ID,发送成功返回消息ID,否则重复发送

Q:消息重复

  • 去重或幂等性

Q:单点问题

  • NSQ节点之间没有复制消息。如果节点挂了,数据就丢失。解决方案:生产者多写入几个节点

Q:消息积压/过期

  • 扩大消费能力。
  • 过期丢失只有重新查询出来导入MQ

Q:一个Tpoic有多个channel,每个channel一个消费者,消费一致性问题

  • 消息消费之后要有反馈
  • 可以重复消费,设置消费次数。

Q:一致性问题(业务处理成功,发送消息失败)

Q:保证消息的顺序性

  • NSQ无法保证

NSQ优缺点

  • 没有顺序
  • 节点之间没有复制

3.2 kafka

  • productor

    • 可以选择消息入哪个topic,哪个分区
  • topic

  • partition 分区,水平扩展

    • 每个分区有一个leader,0-多个follower
  • consumer

    • 就是一个partition,只能被消费组里的一个消费者消费,但是可以同时被多个消费组消费。
  • broker 代理

  • offset 消费者控制,可重复读取