Pulsar 消息同步机制
Pulsar 就是一个消息中间件消息队列和 RabbitMQ、Kafka 是同一类东西。它解决的核心问题就一个让两个服务之间不用直接互相调用而是通过一个信箱传话。放在你的项目里场景特别具体谁发给谁雇员服务在导入员工数据后需要通知薪资服务这个员工的信息变了你同步一下。但雇员服务不想、也不能直接去调薪资服务的接口服务解耦、避免互相依赖、避免一方挂了拖垮另一方。于是雇员服务把变更的员工数据投进信箱薪资服务自己去取信处理。这个信箱就是 Pulsar三个关键概念对应你代码里的位置Topic主题/频道—— 信箱的名字。所有发给这个频道的消息订阅它的人都能收到。Producer生产者—— 寄信人。负责往 topic 里塞消息。核心就是send()方法把对象转 JSON 发出去。雇员服务那边也有对应的 producer。Consumer消费者—— 取信人。负责从 topic 里拿消息并处理。就是专门收员工消息、同步自然人数据的消费者。用你的街道数据走一遍完整流程雇员服务导入 Excel/import接口→ 写好EmployeeBasicInfo含residenceStreet/resideStreet→ 落自己的库 →通过 pulsar producer 把这个 Employee 对象发到employeetopic。薪资服务启动时 就连上 Pulsar订阅这个 topic。每当有新消息进来基类messageListener回调被触发把消息体反序列化成Employee对象校验通过就调handlerData(object)这个方法各消费者自己重写处理完consumer.acknowledge(msg)告诉 Pulsar这条我处理好了可以删了处理失败negativeAcknowledge会让 Pulsar 稍后重投。handlerData在IndividualIncomeTaxConsumer里就是那个把Employee/EmployeeBasicInfo的字段往IndividualDeclareInfo上搬的逻辑这也正好解释了街道为什么断在同步层handlerData搬地址时搬了省市区和详细地址却漏了residenceStreet/resideStreet两行——而薪资服务的 feign 副本EmployeeBasicInfo里也没声明这两个字段所以即便想搬也取不到值。这就是上次说的缺口。两个配置开关开发时很实用值得你知道offFlag设成1就完全跳过 pulsar 初始化本地没 pulsar 环境也能把服务跑起来不用连那台180.100.212.181。开发环境一般开着生产关掉。基类里还配了死信队列一条消息连续失败 3 次maxRedeliverCount(3)就不再重投扔到xxx-DLQ主题里避免一条坏消息把消费者卡死。这是消息队列的标配容错机制。一句话总结Pulsar 是雇员服务和薪资服务之间的传声筒雇员那边改了数据通过 topic 喊一声薪资服务听到后自己同步——双方互不直接调用。街道数据的断点不在 Pulsar 本身而在薪资服务收到消息后搬字段那步漏了两行。一、Pulsar 是什么Pulsar 是一个消息中间件消息队列和 RabbitMQ、Kafka 属同一类。核心作用就一个让两个服务之间不用直接互相调用而是通过一个信箱传话。本系统场景雇员服务导入或变更员工数据后要通知薪资服务同步自然人报送信息。雇员服务不直接调薪资服务的接口而是把变更数据投递到 Pulsar薪资服务自己订阅消费。好处是服务解耦——一方故障不拖垮另一方双方也无直接代码依赖。服务地址在pulsar: serviceUrl: pulsar://180.100.212.181:6650二、三个核心概念概念含义类比Topic消息频道信箱名字Producer发送消息寄信人Consumer接收处理消息取信人员工主题是persistent://public/salary/employee。Producer基类把对象转 JSON 发出。跨服务场景真正的发送入口是雇员服务它组装EmployeeSyncVO后调 SalaryProviderService.javaConsumer基类 用泛型T子类重写validate()和handlerData()。[IndividualIncomeTaxConsumer.java](D:\\EngmaProject\\salary-system\\src\\main\\java\\com\\engma\\salary\\service\\pulsar\\IndividualIncomeTaxConsumer.java) 就是同步自然人信息的消费者泛型是Employee。三、消息消费流程启动 → 连接 Pulsar → 订阅 topic → 注册 messageListener 回调 │ 每条消息到达时触发 │ ┌───────────┴────────────┐ │ 1. 反序列化为泛型对象 T │ │ 2. validate() 校验 │ │ 3. handlerData() 处理 │ │ 4. acknowledge() 确认 │ └────────────────────────┘步骤行号说明初始化连接49PulsarClient.builder().serviceUrl(serviceUrl).build()创建消费者61client.newConsumer().topic(topic).subscribe()接收回调64messageListener((consumer, msg) - {...})反序列化72JSONObject.parseObject(data, tClass)业务分发78handlerData(object)调子类实现成功确认80consumer.acknowledge(msg)告诉 Pulsar 可删失败重投75consumer.negativeAcknowledge(msg)稍后重发确认机制ack/nackack 表示处理成功、消息可删nack 表示失败、1 秒后重投死信队列第65-68行连续失败 3 次的消息不再重投扔进{topic}-DLQ避免坏消息卡死消费者。共享订阅第68行SubscriptionType.Shared同一订阅名下多消费者实例间负载均衡。四、跨服务同步链路以街道为例┌─────────────── 雇员服务 (employee) ───────────────┐ │ 1. POST /import 上传 Excel │ │ └─ EmployeePayTaxesPlusExcel 解析报税 sheet │ │ 含「户籍所在地街道」「居住地街道」两列 │ │ 2. EmployeePayTaxesPlusExcelListener.invoke() │ │ └─ buildBasicInfoForPayPlusTaxes() 搬字段 │ │ info.setResidenceStreet(...) 户籍街道 │ │ info.setResideStreet(...) 居住街道 │ │ 3. updateBatchById() 落库 employee_basic_info │ │ 4. NaturalReportHandle.sendDataToPulsar() │ │ └─ SalaryProviderService.send() 发到 employee topic │ └───────────────────────┬───────────────────────────┘ │ Pulsar 消息JSON ▼ ┌─────────────── 薪资服务 (salary-system) ──────────┐ │ 5. IndividualIncomeTaxConsumer 收到消息 │ │ └─ 反序列化为 Employee → handlerData() │ │ └─ 搬字段到 IndividualDeclareInfo │ │ 216-227行搬地址漏了街道 │ │ 6. 落库 individual_declare_info │ │ 7. /exportList → getDatas() 按 code 取值 │ │ └─ residenceStreet / streetOfResidence │ └───────────────────────────────────────────────────┘各环节代码位置特殊处理省/市/区在导入时经isAddress()[EmployeePayTaxesPlusExcelListener.java:441](D:\\EngmaProject\\employee\\src\\main\\java\\com\\engma\\employee\\excel\\EmployeePayTaxesPlusExcelListener.java)做级联校验、取标准码值街道不校验直接原值透传因为乡镇街道这级没有统一编码标准。五、街道数据断链问题现象导出 Excel 里两列街道始终为空。根因链路在薪资服务搬字段那步断了两个原因feign 副本 [EmployeeBasicInfo.java](D:\\EngmaProject\\salary-system\\src\\main\\java\\com\\engma\\salary\\entity\\feign\\EmployeeBasicInfo.java) 没声明residenceStreet/resideStreet反序列化取不到值消费者 [IndividualIncomeTaxConsumer.java:216-227](D:\\EngmaProject\\salary-system\\src\\main\\java\\com\\engma\\salary\\service\\pulsar\\IndividualIncomeTaxConsumer.java) 搬地址时漏了街道两行修复改薪资服务两处feign 副本补两个字段消费者第227行后补两行info.setResidenceStreet(basicInfo.getResidenceStreet())和info.setStreetOfResidence(basicInfo.getResideStreet())。注意字段名差异雇员侧resideStreet对应薪资侧streetOfResidence。六、配置开关offFlag[salary-dev.yaml:65](D:\\EngmaProject\\salary-system\\src\\main\\resources\\salary-dev.yaml)1关闭 pulsar 初始化本地无 pulsar 也能启动0开启。开发一般设 1生产必须设 0。mockPaidSwitch第67行1注入 mock 数据0关闭。七、Topic 命名坑重要两端 topic 命名不一致薪资服务订阅persistent://public/salary/employee无后缀雇员服务发送persistent://public/salary/employee-{active}active默认dev默认配置下雇员发到...-dev薪资服务订阅的是无后缀版本收不到。排查同步问题优先确认两端 topic 是否匹配。八、组件一览消费者IndividualIncomeTaxConsumer自然人同步、LaborContractHandleConsumer劳动合同、IndividualContractRenewConsumer合同续签、SalaryBatchPayInfoConsumer薪资发放、AttendanceHandleConsumer考勤。生产者PulsarProducerService基类、AttendanceUsedStatusProducer、SalaryBatchCalculatedProducer、RecruitSalaryChannelProducer。九、排查指引消费失败日志搜[PULSAR]message error连续失败 3 次进死信队列{topic}-DLQ确认两端 topic 一致。本地开发offFlag1跳过初始化即可启动。同步验证导入带街道的数据 → 看日志有无PULSAR---msg---和确认收到消息→ 查表residence_street有无值 → 调导出接口验证 Excel。

相关新闻

AI工艺自动调整项目实现第1讲:整个工艺流程;方阻相关的问题;原数据理解;项目总思路;首先要完成的项目1

AI工艺自动调整项目实现第1讲:整个工艺流程;方阻相关的问题;原数据理解;项目总思路;首先要完成的项目1

一、整个工艺流程是怎么样的? 1、半导体光伏(太阳能电池)扩散与薄膜沉积工艺 半导体光伏(太阳能电池)或集成电路制造中的扩散与薄膜沉积工艺,主要集中在管式炉(Tube Furnace)设备上进行。具体解释如下: LPCVD (LP): Low Pressure Chemical Vapor Depositio,低压化学…

2026/7/23 22:41:42阅读更多 →
新能源储能与充电设施出海通信架构实战:全球射频自适应与高可用拨号守护机制

新能源储能与充电设施出海通信架构实战:全球射频自适应与高可用拨号守护机制

摘要:随着新能源储能系统与快充基础设施的大规模出海,中国制造的设备正全面接入海外当地的复杂通信网络。然而,跨国部署中频段碎片化、海外运营商通信制式高度非标准化以及野外弱网环境下的链路僵死,构成了出海设备交付后的重大运…

2026/7/23 22:39:42阅读更多 →
打破“无坐标、慢响应”魔咒:AI Agent驱动的毫秒级态势推演与决策闭环

打破“无坐标、慢响应”魔咒:AI Agent驱动的毫秒级态势推演与决策闭环

一、行业共性技术桎梏传统安防系统缺失像素原生三维坐标体系。二维监控画面无统一空间基准。跨摄像机跟踪目标坐标漂移轨迹断裂。静态数字孪生模型更新延迟分钟级。态势分析依赖人工回看事后处置响应滞后。有源定位硬件部署周期长存在电磁泄密风险。多路视频融合时序不同步数据…

2026/7/23 22:39:42阅读更多 →
虹膜VS指纹:2026年,谁才是下一代生物识别的终极答案?

虹膜VS指纹:2026年,谁才是下一代生物识别的终极答案?

最新内容搜索网络研观观阅读在制定企业级安全架构、国家级数字身份(National ID)或公共防务领域的身份验证方案时,决策者们正面临着一个前所未有的十字路口:究竟该坚守历史悠久的指纹识别,还是全面转向风头正劲的虹膜识…

2026/7/24 0:02:06阅读更多 →
企业短信平台技术架构与合规落地实战:验证码、通知、营销短信底层原理与避坑方案

企业短信平台技术架构与合规落地实战:验证码、通知、营销短信底层原理与避坑方案

标签:#短信平台 #企业短信 #验证码短信 #营销短信 #通信架构 #合规风控阅读对象:后端开发、系统集成、企业IT运维、业务中台对接、通信项目交付工程师摘要:短信是互联网、政企、电商、金融体系中最高可用、最低延迟的基础触达通道&#xff0c…

2026/7/24 0:02:06阅读更多 →
隐私小号中间号技术架构实战:隐私通话、号码保护、AXB中继模式与企业落地避坑

隐私小号中间号技术架构实战:隐私通话、号码保护、AXB中继模式与企业落地避坑

标签:#隐私小号 #中间号 #AXB中继 #号码隐私保护 #语音中继 #企业通信安全阅读对象:后端开发、通信架构师、系统集成、政企交付、客服中台对接工程师摘要:在电商外卖、网约车、物流配送、同城服务、外勤运维等场景中,用户与服务人…

2026/7/24 0:02:06阅读更多 →
隐藏了IP却躲不开“数字指纹”:微软遥测技术是如何协助FBI抓获黑客的?

隐藏了IP却躲不开“数字指纹”:微软遥测技术是如何协助FBI抓获黑客的?

最新内容请搜索网络研观观阅读 在很多人的认知中,VPN(虚拟专用网络)是网络世界的“隐身斗篷”。只要开启了 VPN,真实的 IP 地址就会被隐藏,网络活动似乎就变得无迹可寻。然而,近期美国解封的一份刑事诉状彻…

2026/7/24 0:02:06阅读更多 →
2026年全球网络安全大盘点:119项核心数据硬核拆解

2026年全球网络安全大盘点:119项核心数据硬核拆解

现代黑客早就不是当年那些在小黑屋里单纯为了炫技的“技术宅”了,现在的网络犯罪已经是一条年产值万亿美元的“黑金产业链”。随着生成式 AI 和智能武器的爆发,2026 年的网络安全形势可以说是全面进入了“神仙打架”的硬核时代。 很多老板总觉得“我们公…

2026/7/24 0:02:06阅读更多 →
【Unity学习】

【Unity学习】

文章目录c#脚本基本语句一、游戏启动的基本语句二、游戏运行的基本语句1.游戏运行的基本语句2.对物体的相关操作三、Unity组件的一些方法1.Rigidbody组件2.Collider组件3.Audio Source组件四、Unity脚本常用的方法实现1.角色移动和视角移动c#脚本基本语句 一、游戏启动的基本语…

2026/7/24 0:00:06阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →