为什么会有消息系统(优点)
解耦
削峰
先用队列承接,后面慢慢消费异步
订单下单
为啥不使用线程?
天然广播📢 (发布)
各取所需(订阅)
天然的涉及到分布式事务
使用消息队列带来的问题(缺点)
消息的重复消费
解决:业务端保持幂等性
消息表,使用msgId做主键或者唯一约束
消息丢失
如何解决?先入事务表消息的顺序消费
场景: 例如订单创建、支付、发货、收货是有顺序的消息的顺序发送:让同一个订单发送至同一个队列,而不是这个订单的消息发送到多个队列,这样在同单号的业务主线中就保证了消息的顺序性
消息的顺序消费:顺序消费有消费者业务保证(Hash等操作都可以完成)
哪些场景会产生消息重复?
网络闪断
ACK返回失败
Kafka
Kafka丢数据、重复消费、顺序消费的问题
Kafka 中 Partition(分区)是真正保存消息的地方,我们发送的消息都被放在了这里。而我们的 Partition(分区) 又存在于 Topic(主题) 这个概念中,并且我们可以给特定 Topic 指定多个 Partition配置 acks = all 代表则所有副本都要接收到该消息之后该消息才算真正成功被发送
我们不能默认在调用send方法发送消息之后消息消息发送成功了。为了确定消息是发送成功,我们要判断消息发送的结果。但是要注意的是 Kafka 生产者(Producer) 使用 send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果
Kafka的底层数据结构
kafka怎么做到基于磁盘却比内存还快?
顺序读写
零拷贝。零拷贝(Zero-Copy)是一种 I/O 操作优化技术,可以快速高效地将数据从文件系统移动到网络接口,而不需要将其从内核空间复制到用户空间。
并不是所有的操作系统都支持这一特性,目前只有在使用 NIO 和 Epoll 传输时才可使用该特性
零拷贝技术原理: https://juejin.cn/post/6995519558475841550
Kafka 的多副本机制了解吗?带来了什么好处?
Kafka 为分区(Partition)引入了多副本(Replica)机制。分区(Partition)中的多个副本之间会有一个叫做 leader 的家伙,其他副本称为 follower。我们发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。
Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。
Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。