新闻详情

新闻详情

首页 / 资讯中心 / 详情

Docker 部署 Kafka 消息中间件实战:Lottery 抽奖系统 MQ 环境搭建与生产消费验证

发布时间:2026/9/25 20:03:44来源:尧图网络
Docker 部署 Kafka 消息中间件实战:Lottery 抽奖系统 MQ 环境搭建与生产消费验证
文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载本篇是 Lottery 分布式抽奖系统系统运维篇章的第 3 节实战指南。核心目标是在云服务器上借助 Docker 容器化技术安装并配置 Kafka 消息中间件含其依赖的 Zookeeper在 Kafka 后台为抽奖系统创建所需的 Topic 主题并最终在本地程序中完成消息的生产与消费联调测试。读完本文你将掌握从镜像拉取、容器启动、主题创建到 SpringBoot 程序验证的完整 Kafka 部署链路并理解这套 MQ 环境如何在抽奖系统中承担抽奖与发货流程解耦的关键职责。在 Lottery 抽奖系统基于 DDD 领域驱动设计的四层架构实践中Kafka 是连接抽奖与发奖两个领域的关键纽带——抽奖完成后通过 MQ 异步触达奖品发货流程避免流程过长导致用户长时间等待。本部署章节与 Part-2 第 15、16 节的代码实现章节相互呼应所搭建的 Kafka 环境正是为了让这套 MQ 机制真正跑起来。文档原文见 第03节部署环境 Kafka。一、为什么抽奖系统需要 Kafka 消息中间件在动手部署之前先明确这套环境在项目中的定位。Lottery 项目的核心技术栈包含 SpringBoot、MyBatis、Dubbo、MQ、Redis、MySQL、ELK、分库分表等见 Lottery 抽奖系统介绍其中 MQ 选型在项目初期采用 Kafka正如 第15节搭建MQ消息组件Kafka服务环境 中所说明的MQ 消息的使用不非得局限于 Kafka也可以使用 RocketMq但 Kafka 本身具备非常突出的特性可靠性Kafka 是分布式、分区、复制且容错的消息在集群内复制以防止数据丢失可扩展性消息系统可以轻松横向扩展且无需停机耐用性Kafka 使用分布式提交日志commit log消息会尽可能快地持久化到磁盘上性能对于消息的发布和订阅都具有高吞吐量即使存储了大量消息也能保持稳定性能。而 Kafka 在架构上构建在 Zookeeper 同步服务之上因此部署 Kafka 必然要一并部署 Zookeeper——这也是本部署章节第一步先启动 Zookeeper 的原因。Zookeeper 在 Kafka 集群中承担 broker 注册发现、控制器Controller选举、Topic/分区元数据维护等协调职责。在 Lottery 面试技能与问题汇总 中针对为什么使用 MQ 解耦发奖流程给出了清晰的项目答案把抽奖和发奖用 MQ 消息串联起来避免一个流程太长导致用户一直等待。这也正是本章节部署 Kafka 的最终业务价值所在。二、下载 Kafka 与 Zookeeper 镜像在 Docker 容器中安装 Kafka 的第一步是拉取镜像。原文档选用的是wurstmeister组织维护的 Kafka 与 Zookeeper 镜像可以在 Docker Hub 官网镜像市场搜索对应镜像名称获取详细信息。在云服务器终端执行如下两条命令分别拉取 Kafka 与 Zookeeper 镜像docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper部署前提本文以云服务器 Docker 容器为部署环境。在 第01节在云服务器部署 Docker 中已经完成了 Docker 的安装与 Portainer 运维面板的部署。如果你的服务器拉取 Docker Hub 镜像时报错如error response from daemon: Get https://registry-1.docker.io/v2/...可以参考该节中配置registry-mirrors国内镜像加速的daemon.json写法后重启 Docker 再拉取。命令参数说明参数含义pull从 Docker Hub 拉取指定镜像到本地wurstmeister/kafkaKafka 镜像包含 Kafka Server 与配套脚本wurstmeister/zookeeperZookeeper 镜像用于支撑 Kafka 集群协调三、启动 Zookeeper 容器Kafka 依赖 Zookeeper 完成集群元数据管理因此必须先于 Kafka 启动 Zookeeper。原文档给出的启动命令如下docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper命令逐项拆解参数含义-d以守护进程后台方式运行容器容器日志可通过docker logs zookeeper或 Portainer 查看--name zookeeper为容器命名后续管理、停止、删除都可通过该名称操作-p 2181:2181端口映射将容器内 2181 端口映射到宿主机的 2181 端口供 Kafka 与外部客户端访问-t分配一个伪终端TTY便于查看交互式输出wurstmeister/zookeeper使用的镜像名称启动后Zookeeper 的默认监听端口即为 2181客户端连接端口。由于后续 Kafka 容器需要与 Zookeeper 通信且本地程序联调时也可能直接访问 Zookeeper这个端口映射至关重要。注意如果容器间需要互相通信Kafka 容器内访问 Zookeeper 既可以使用宿主机 IP如192.168.x.x:2181也可以让 Kafka 与 Zookeeper 处于同一 Docker 网络--network下通过容器名互访。云服务器部署场景下为了让本地程序能够远程连接还需要确保云厂商安全组中放行 2181、9092 等端口。四、启动 Kafka 容器并完成配置启动 Zookeeper 后即可创建并启动 Kafka 容器。由于 Kafka 容器需要感知集群信息与外部访问地址启动命令中需要注入关键环境变量docker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID0 \ -e KAFKA_ZOOKEEPER_CONNECT你的云服务器IP:2181 \ -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://你的云服务器IP:9092 \ -e KAFKA_LISTENERSPLAINTEXT://0.0.0.0:9092 \ wurstmeister/kafka核心环境变量说明环境变量作用KAFKA_BROKER_IDBroker 唯一标识单机部署可设为 0KAFKA_ZOOKEEPER_CONNECT指定 Kafka 连接的 Zookeeper 地址指向上面启动的 Zookeeper 容器宿主机 IP:2181KAFKA_ADVERTISED_LISTENERS对外公布的监听地址必须配置为客户端本地程序能够访问到的 IP否则本地程序会因拿到容器内部地址而连接失败KAFKA_LISTENERSBroker 实际监听的地址0.0.0.0:9092表示监听宿主机所有网卡的 9092 端口启动完成后可以通过 Portainer 运维面板直观地查看 kafka 容器的运行状态与日志例如 Kafka 的 GroupCoordinator消费者组协调器会持续输出消费者组加入、退出等协调日志。下图展示了 Portainer 中 kafka 容器日志页面日志中记录了抽奖系统lottery消费者组成员变化情况这正是后续本地测试程序接入消费后的真实运行痕迹原文档以运维日志形式记录了这一部署环节在 Docker 容器中安装和配置 Kafka 环境、在 Kafka 后台添加抽奖系统需要的 Topic 主题并在本地程序中进行测试。部署到这一步Kafka 环境已经具备承载 Topic 的能力。五、在 Kafka 后台创建抽奖系统需要的 TopicKafka 中的消息以 Topic主题为单位组织生产者向 Topic 写入消息消费者从 Topic 拉取消息。抽奖系统需要为发货单消息创建专属主题。在 第16节使用MQ解耦抽奖发货流程 中明确说明启动 kafka 新增 topiclottery_invoice 用于发货单消息当抽奖完成后则发送一个发货单再异步处理发货流程这个部分就是 MQ 的解耦流程使用。对应 Topic 创建命令如下本地 Kafka 安装包方式启动时的标准写法# 启动 Zookeeper若使用本地安装包而非 Docker bin/zookeeper-server-start.sh -daemon config/zookeeper.properties # 启动 Kafka bin/kafka-server-start.sh -daemon config/server.properties # 创建抽奖系统发货单主题 bin/kafka-topics.sh --create --zookeeper localhost:2181 \ --replication-factor 1 --partitions 1 --topic lottery_invoice参数说明参数含义--create创建新主题--zookeeper localhost:2181指定 Zookeeper 地址主题元数据由 Zookeeper 管理--replication-factor 1副本因子为 1单机部署时无需多副本--partitions 1分区数为 1单机场景下足以支撑抽奖系统的消息收发--topic lottery_invoice主题名称即抽奖发货单消息主题如果 Kafka 运行在 Docker 容器中也可以进入容器执行同样的脚本例如docker exec -it kafka bin/kafka-topics.sh --create \ --zookeeper 你的云服务器IP:2181 \ --replication-factor 1 --partitions 1 --topic lottery_invoice创建完成后可通过bin/kafka-topics.sh --list --zookeeper localhost:2181验证主题是否已存在。六、本地程序测试SpringBoot 整合 Kafka 验证生产与消费环境就绪后需要在本地程序中完成消息的生产与消费联调验证。这一部分对应 第15节搭建MQ消息组件Kafka服务环境 的分支211023_xfg_mq_kafka其核心工作是搭建 Kafka 环境配置消息主题、SpringBoot 整合 Kafka验证消息的生产和消费。1. 配置生产者与消费者在 SpringBoot 工程中引入 Kafka 依赖后主要配置分为三块生产者配置bootstrap.servers指向你的云服务器IP:9092即上文KAFKA_ADVERTISED_LISTENERS中公布的地址key.serializer与value.serializer配置为StringSerializer将消息对象序列化为字符串发送。消费者配置同样指向bootstrap.serverskey.deserializer与value.deserializer配置为StringDeserializergroup.id指定消费者组例如lotteryPortainer 日志中出现的lottery组即来源于此enable.auto.commit决定是否自动提交消费位点。Topic 确认消费者监听lottery_invoice主题收到发货单消息后进入发奖流程处理。2. 验证消息生产与消费本地程序启动后向lottery_invoice主题发送一条消息此时应能在消费者端日志中看到消息被成功接收。同时在 Portainer 的 kafka 容器日志页面中可以看到 GroupCoordinator 输出消费者组的加入与退出记录如前面 3-02 截图所示这是确认本地程序已成功接入 Kafka 集群的最直观证据。常见联调问题与排查方向现象可能原因排查方向生产/消费超时云服务器安全组未放行 9092 端口检查安全组入站规则消费者连不上 BrokerADVERTISED_LISTENERS配成了容器内地址改为云服务器公网可达 IP主题不存在未提前创建lottery_invoice按第五节命令创建主题七、抽奖系统中的 MQ 应用解耦抽奖与发货流程Kafka 环境验证通过后抽奖系统便真正具备了异步解耦能力。在 第16节使用MQ解耦抽奖发货流程 中这套机制在代码层面的落地点包括库表扩展在数据库表user_strategy_export中添加字段mq_state用于标记 MQ 消息是否发送成功——发送成功后更新库表状态若发送失败则通过定时任务补偿 MQ 消息保证消息最终可达。异步发货在ActivityProcessImpl#doDrawProcess活动抽奖流程编排中用户抽奖完成后发送 MQ 消息触达异步奖品发送流程抽奖接口立即返回用户无需等待发奖完成。流程闭环消费者收到lottery_invoice发货单消息后进入奖品发放的处理链路完成从抽奖到发奖的异步闭环。这一设计与 Lottery 面试技能与问题汇总 中的项目问答相互印证解耦抽奖流程把抽奖和发奖用 MQ 消息串联起来避免一个流程太长导致用户一直等待同时面试中还会考察消息丢失怎么办——mq_state状态字段 定时任务补偿正是该项目给出的答案。八、部署验证清单完成本章节部署后建议按以下清单逐项自检docker ps中 zookeeper 与 kafka 两个容器均为 Up 状态Portainer 容器列表可见两个容器kafka 日志无 ERROR 级报错kafka-topics.sh --list可列出lottery_invoice主题本地 SpringBoot 程序向lottery_invoice发送消息消费者端与 Portainer 日志中均有消费记录云服务器安全组已放行 2181Zookeeper与 9092Kafka端口。至此Lottery 抽奖系统的 Kafka 消息中间件环境搭建完成后续的 MQ 解耦发货流程、消息补偿等业务功能均可以在此基础上继续开发与联调。赞分享文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载相关推荐云服务器部署 Docker 实战为 Lottery 抽奖系统搭建容器环境与 Portainer 面板云服务器部署 Docker 实战为 Lottery 抽奖系统搭建容器环境与 Portainer 面板 在 Lottery 抽奖系统基于 DDD 四层架构的分文档教程后端log-lottery抽奖系统技术实现与部署指南log lottery抽奖系统技术实现与部署指南 技术架构解析 log lottery是一个基于现代前端技术栈构建的3D抽奖应用其核心架构采用分层设计理念。前前端桌面应用lottery抽奖系统终极部署指南5步快速搭建活动平台lottery抽奖系统终极部署指南5步快速搭建活动平台 在各类企业活动、年会庆典中如何打造一个既酷炫又高效的抽奖系统一直是活动策划者的痛点。lottery开后端前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

自托管云开发平台Coder接入AI编码代理:部署实践与踩坑指南 2026/9/25 20:34:32

自托管云开发平台Coder接入AI编码代理:部署实践与踩坑指南

如果你正在寻找一套能自己控制的云开发环境,Coder 这个名字应该不陌生。它是一个自托管云开发平台的典型代表,我最近把 Coder 和 AI 编码代理接在一起用了一轮,整体跑下来感受很深:环境管理可以像资源调度一样干净利落&#xff0c…

阅读更多 →
光伏电池发电原理:从光子到电子的能量转换之旅 2026/9/25 20:34:19

光伏电池发电原理:从光子到电子的能量转换之旅

1. 引言 随着全球对清洁能源需求的日益增长,光伏发电作为最具代表性的可再生能源技术之一,正走进千家万户。从屋顶的分布式光伏板到广袤的沙漠光伏电站,光伏电池将太阳光直接转化为电能,为人类提供源源不断的绿色电力。那么&#…

阅读更多 →
LibreChat自托管部署实战:用Docker Compose统一管理多模型AI聊天 2026/9/25 20:33:59

LibreChat自托管部署实战:用Docker Compose统一管理多模型AI聊天

上个月我把 LibreChat 部署到了自己的一台小服务器上,然后默默把浏览器里那一排 AI 网页标签页全部关掉了。LibreChat 是一个开源的、支持自托管的多模型聊天平台——不只是接一家模型,而是把 OpenAI、Anthropic、Google、OpenRouter,以及本地…

阅读更多 →
WeGame打开闪退怎么办?六种排查与修复方法详解 2026/9/25 20:33:52

WeGame打开闪退怎么办?六种排查与修复方法详解

闪退的解决方法:WeGame打开就闪退怎么办?六种解决方法全教给你先说一句大实话:WeGame打开就闪退,十次里有七次不是游戏平台本身坏了,而是你电脑上某个“外部因素”把它挤兑崩了。我这些年帮朋友、帮网友排查过无数个“…

阅读更多 →
高副低代详解:从凸轮到齿轮的机构运动分析 2026/9/25 20:33:52

高副低代详解:从凸轮到齿轮的机构运动分析

每次给同事讲凸轮机构的运动分析,我都会先让他们做一个看上去有点“多此一举”的操作:把凸轮与从动件在接触点处的高副,替换成一根虚拟连杆加两个转动副。很多人不理解,觉得接触点明明就在那儿,几何关系看得很清楚&…

阅读更多 →
video-use:命令行视频处理套件,让ffmpeg更易用 2026/9/25 20:33:46

video-use:命令行视频处理套件,让ffmpeg更易用

“video-use”这个名字,第一次听容易让人摸不着头脑——它是干啥的?看视频的?剪视频的?我最初拿到这个项目时也愣了一下,翻完代码和文档才明白,它其实是一个把“视频怎么用”这件事做成了工具链的命令行视频…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉