使用消息队列,我们肯定希望不丢消息,也就是消息队列组件,需要保证消息的可靠交付。消息交付的可靠性保障,有以下三种承诺:

  • 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。
  • 至少一次(at least once):消息不会丢失,但有可能被重复发送。
  • 精确一次(exactly once):消息不会丢失,也不会被重复发送。

默认是一般是 至少一次,也就是 Broker 收到并成功提交消息,并且 Producer 成功应答才会认为消息已经发送。

某些情况下,比如网络波动等,导致应答没有成功送达,会导致 Producer 重试,从而导致消息的重复发送。

这就要提到主角——幂等性 Producer 了。

幂等性,比如数学中的乘法运算,乘以 1 就是一个幂等操作。因为不管执行多少次乘法,结果都是一样的。

幂等性 Producer 就是在向 Broker 发送数据时,可以避免同个分区下的消息重复。

开启方式仅需指定 enable.idempotencetrue

但是!

有个很重要的一点,它针对的是单个分区下的幂等,而且是单个会话内的幂等,也就是说,如果进程重启,就没办法保证幂等性了。

而幂等性的实现原理,就得提到 ProducerIDSequenceNumber 了。

  • ProducerID:Producer 初始化会被分配一个唯一标识,对客户端无感知,重启会发生变化;
  • SequenceNumber:对于每个主题和分区,都对应一个从 0 开始单调递增的 SequenceNumber 值,Broker 也会存储。

判断重复的逻辑,原理就很简单了:

通过 ProducerID 和 SequenceNumber,去 Broker 查询队列 ProducerStateEntry.Queue(默认队列长度为 5)是否存在:

  • 如果 Producer SequenceNumber == Broker SequenceNumber + 1,接收消息;
  • 如果 Producer SequenceNumber == 0 && Broker SequenceNumber == MaxInt,接收消息(刚初始化);
  • 否则,就是重复了,拒绝接收。

由此看出,ProducerID 和 SequenceNumber 可以避免消息的重复发送,也避免消息乱序(因为 SequenceNumber 单调递增)。

做到幂等性,也就意味着可以安全重试任何操作。从而做到了消息的可靠传输。

然而,还有个很重要的一点,就是上面说的,上面讲的都是分区下的幂等,多个分区的幂等性,需要通过 事务 来解决。

限于篇幅,今天先记录到这里,事务的待我好好研究下再写哈哈!最后,祝大家新年快乐!


文章来源于本人博客,发布于 2023-01-01,原文链接:https://imlht.com/archives/414/

posted @ 2023-08-03 22:29 仁扬 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 这段时间工作的需求多了不少,文章开始越来越水了。 实在抱歉,时间真的很仓促。 本次分享的是一个函数——根据首尾字符串截取中间的字符串。 虽然这个函数非常简单,但是真的很好用!也很常用! 比如 “我今天真的很高兴” 这句话,要把 `今天` 截取出来: 常规的方式是 `strings.Index` 出位 阅读全文
posted @ 2023-08-03 00:01 仁扬 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 容器化,是指使用容器技术(Docker/containerd等)运行应用程序(容器),并使用容器编排技术(例如 K8s)来管理这些容器。 我在之前的文章 [《使用 Dockerfile 构建生产环境镜像》](https://imlht.com/archives/236/) 提及普通的虚拟机部署存在的 阅读全文
posted @ 2023-08-03 00:00 仁扬 阅读(44) 评论(0) 推荐(0) 编辑
摘要: > 最后更新时间 ***2023-07-07***. macwk.com 在 2022-10-05 关站,域名停止解析,已经打不开了。 翻了很多资料,收集了几个网站作为替代,大家有需要可以试试,如果有更好的麻烦告诉我哈哈! 网站语言为中文,资源免费,推荐: - https://www.macyy.c 阅读全文
posted @ 2023-08-01 00:14 仁扬 阅读(721) 评论(1) 推荐(0) 编辑
摘要: > 最后更新时间 ***2023-01-24***. ## 背景 笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。 相比 Go 语言,互联网公司常见的 Nginx + PHP-FPM 模式,经常会出现性能问题—— 特 阅读全文
posted @ 2023-08-01 00:13 仁扬 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 日常听说 HTTPS 是加密协议,那现实中的 HTTPS 流量,是真的完全加密吗? ——答案是,不一定。原因嘛,抓个包就知道了。 我们用 curl 命令触发一下: ```bash curl -v 'https://s-api.37.com.cn/api/xxx' * Trying 106.53.10 阅读全文
posted @ 2023-07-31 23:42 仁扬 阅读(889) 评论(2) 推荐(2) 编辑
摘要: Go 自带接口性能分析工具 pprof,较为常用的有以下 4 种分析: - CPU Profiling: CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置; - Memory Profiling: 内存分析,在应用 阅读全文
posted @ 2023-07-28 23:26 仁扬 阅读(368) 评论(0) 推荐(0) 编辑
摘要: ### 一、什么是主从同步? **主从同步,就是将数据冗余备份,主库(Master)将自己库中的数据,同步给从库(Slave)。** 从库可以一个,也可以多个,如图所示: ![Redis主从同步](https://imlht.com/usr/uploads/2022/09/427616533.png 阅读全文
posted @ 2023-07-27 23:16 仁扬 阅读(661) 评论(3) 推荐(2) 编辑
摘要: > 注意:如果你公司的 VPN 网络是在苹果下使用的,本文可能不适用(苹果系统不支持 PPTP)。 用 Linux 和用 Windows/macOS 不一样,它真的需要用户操心很多东西。比如怎么连接公司的 VPN 网络…… 我是折腾了挺久,反正系统自带的 VPN 连接管理界面,不管你怎么配置,就是用 阅读全文
posted @ 2023-07-26 23:37 仁扬 阅读(3) 评论(0) 推荐(0) 编辑
摘要: > “记得上次用 Manjaro Linux 的时候,还是上次:)” 三年前,工作都是在 Linux 下完成的——那时候的我还没买苹果电脑,每天的快乐就是折腾 Linux 发行版。 比如 Ubuntu、Debian、Deepin 深度、Linux Mint 薄荷、CentOS、Manjaro……小众 阅读全文
posted @ 2023-07-25 23:48 仁扬 阅读(1802) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示