消息队列

1. 消息队列对比

img

2. 为什么Kafka不能支持更多的分区?

  • 分区内顺序写入,性能高,如果分区多,分区变多,操作系统看,写入变的随机

3. RocketMQ可以支持更多分区

  1. 所有消息数据都存储在提交日志文件中。所有写入都是完全顺序的,而读取是随机的。
  2. ConsumeQueue存储实际的用户消费位置信息,这些信息也以顺序方式刷新到磁盘

4. 为什么kafka设计中要引入分区,好处是什么?

如果没有引入分区,意味着只能写入一台机器,不利于数据负载均衡和横向扩展。

引入多分区对写,分区落在不同服务器,提升并发写的能力

读方面,消费消息的时候是跟消费者组进行绑定,可以从不同节点的不同分区进行消费消息,提高了读消息的能力

5. 消息丢失

5.1 生产者丢失

  • 异步发送,无回调 : 解决 异步回调,重试机制

5.2 broker 丢失

5.2.1 丢失场景

  • 消息异步刷盘

  • 单副本

5.2.2 kafak 和rocketMq防丢失配置

  • RocketMQ分为同步刷盘和异步刷盘(异步刷前宕机丢失)

  • kafak消息中间件配置:

  1. acks=all 只有参与复制的所有节点全部收到消息,才返回⽣产者成功。这样的话除⾮所有的节点都挂了,消息才会丢失。

  2. replication.factor=N,设置⼤于1的数,这会要求每个partion⾄少有2个副本

  3. min.insync.replicas=N,设置⼤于1的数,这会要求leader⾄少感知到⼀个follower还保持着连接

  4. retries=N,设置⼀个⾮常⼤的值,让⽣产者发送失败⼀直重试

5.3 消费者丢失

  • ack自动提交,服务挂了,导致丢失,解决方案:改为手动提交