示例工程【免费下载链接】rabbitmq-tutorialsTutorials for using RabbitMQ in various ways项目地址https://gitcode.com/gh_mirrors/ra/rabbitmq-tutorials点击查看免费下载本篇技术指南围绕开源仓库rabbitmq-tutorials展开它是 RabbitMQ 官方教程 的可运行代码实现合集从最简单的 Hello World 生产者/消费者到 Work Queues、发布订阅、Routing、Topics、RPC 与 Publisher Confirms共七个 AMQP 0-9-1 教程外加 Stream 协议教程均以 20 余种语言/客户端库完整移植。读完本文你将掌握该仓库的目录结构、前置环境要求、每个教程背后的核心 RabbitMQ 概念与关键 API 调用链并能从 Python 示例出发快速在任何一门语言中复现和运行全部教程。一、仓库定位可运行代码与官网概念讲解分离仓库根目录 README.md 开宗明义本仓库只包含可运行的代码This repository only contains runnable code配套的概念讲解、需求说明、受支持的客户端库版本等详细内容全部由官网教程页面承担。因此正确的使用姿势是先在官网读懂概念再到本仓库找到对应语言的代码直接运行。这一设计还体现在仓库根目录的 AGENTS.md 中它明确写道仓库内代码与官网散文prose需要保持一致更新not necessarily in lockstep, but updated consistently within a few days of each other。也就是说本仓库是教程体系的代码侧权威实现。仓库结构约定从根目录结构看每个顶层目录都是一个自包含的语言移植tutorial port拥有自己独立的 README.md 来说明依赖安装与运行方式。目录命名遵循两条规则常规目录如python/、go/、dotnet/覆盖AMQP 0-9-1协议教程带-stream后缀的目录如python-stream/、go-stream/、javascript-nodejs-stream/、elixir-stream/、dotnet-stream/、rust-stream/覆盖RabbitMQ Stream 协议教程需要启用 Stream 插件。按照 AGENTS.mdAMQP 0-9-1 教程采用跨语言统一的标准文件命名这是全仓库最值得记住的映射关系教程主题生产者文件消费者文件Tutorial 1 (T1)Hello WorldsendreceiveTutorial 2 (T2)Work Queuesnew_taskworkerTutorial 3 (T3)Publish/Subscribeemit_logreceive_logsTutorial 4 (T4)Routingemit_log_directreceive_logs_directTutorial 5 (T5)Topicsemit_log_topicreceive_logs_topicTutorial 6 (T6)RPCrpc_clientrpc_serverTutorial 7 (T7)Publisher Confirmspublisher_confirms—Stream 教程则统一覆盖send/receive与offset_tracking_send/offset_tracking_receive两对示例。二、前置条件本地默认配置的 RabbitMQ 节点根 README.md 的 Prerequisites 章节给出了硬性前提All tutorialsrequire a RabbitMQ node running on localhostwith stock (default) settings.即所有教程都要求一个运行在localhost、采用出厂默认配置的 RabbitMQ 节点。AGENTS.md 进一步补充所有示例都使用默认的、被约束在 localhost 的种子用户guest及其众所周知的凭据默认口令也是guest。各语言 README 也反复出现相同表述例如 python/README.md、java/README.md 中的 a running RabbitMQ server/node。因此在动手之前你只需要在本机启动一个默认配置的 RabbitMQ 节点即可无需创建任何用户或虚拟主机。README 列出的可选安装途径包括Windows 安装程序Docker 镜像macOS 上的 HomebrewUbuntu/Debian 以及基于 RPM 的发行版软件包适用于 Linux、BSD 及其他 UNIX 系系统的通用二进制构建。注意localhost约束的guest用户默认只能从本机地址访问。如果你把连接地址改为远程 RabbitMQ 节点通常会因权限问题被拒绝此时需自行创建用户例如 spring-amqp/README.md 中介绍的远程连接配置方式见后文。三、语言移植矩阵20 余种语言与客户端库一览根 README.md 的 Languages 章节完整列出了全部移植。下表将 README 条目与仓库实际目录一一对应并补充各子目录 README 中声明的客户端库作为实现事实语言仓库目录客户端库/工具链以各子目录 README 为准C#dotnet/.NET 8 RabbitMQ.Client 7.2.xClojureclojure/LangohrLeiningen 运行Common Lispcommon-lisp/Cl-BunnyQuicklisp 安装Dartdart/dart_amqpElixirelixir/pma/amqp基于官方 Erlang 客户端Elixir (Streams)elixir-stream/rabbitmq-stream-elixir-clientErlangerlang/RabbitMQ Erlang Clientrebar3 编译Gogo/rabbitmq/amqp091-go v1.13.0见 go.modHaskellhaskell/Network.AMQPstack/runhaskellJavaScript (Node amqplib, 回调风格)javascript-nodejs/amqplibJavaScript (Node amqplib, Promise 风格)外部链接指向 amqplib 项目amqplibJava手动管理依赖java/amqp-client 5.21.0 SLF4JJava with Gradlejava-gradle/Gradle Wrapper源码符号链接至java/Java with Mavenjava-mvn/amqp-client 5.36.0见 pom.xmlKotlinkotlin/KourierKotlin MultiplatformKotlin 2.1.21KotlinJava 客户端风格kotlin-java-client/RabbitMQ Java ClientPHP (php-amqplib)php/php-amqplibPHP 7.2PHP (php-amqp)php-amqp/php-amqp 扩展PHP (queue-interop)php-interop/enqueue/amqp-* 系列传输Perlperl/Net::RabbitFootPython (Pika)python/pika 1.0.0 或更新Ruby (Bunny)ruby/BunnyRuby 3.1.0BundlerRust (amqprs)rust-amqprs/amqprsRust (Lapin)rust-lapin/lapinScalascala/RabbitMQ Java ClientMavenSwiftswift/BunnySwiftSwift 6.0Spring AMQPspring-amqp/Spring AMQPSpring Profiles 驱动SoapUIsoapui/SoapUI/ReadyAPI Java ClientCcpp/Bloomberg rmqcppC17vcpkg 构建Zigzig/bunny-zigZig 0.16.0Juliajulia/AMQPClient JSON另有 AMQP 1.0 专用移植java-amqp/RabbitMQ AMQP 1.0 Java client需RabbitMQ 4.0与 dotnet-amqp/RabbitMQ.AMQP.Client需 RabbitMQ 4.x以及 Stream 协议的各语言移植python-stream/、go-stream/、javascript-nodejs-stream/、dotnet-stream/、rust-stream/。四、从 Python 移植入手T1–T6 全流程代码解析python/README.md 是最具代表性的子文档它给出了 pika 客户端1.0.0或更新版本的安装方式以及 T1–T6 每一课的运行命令。我们以此为主线结合python/目录源码逐课深入。4.1 环境准备python -m pip install pika若pip缺失可先执行easy_install pip。所有示例都通过pika.BlockingConnection(pika.ConnectionParameters(hostlocalhost))连接本机默认 5672 端口。4.2 T1 Hello Worldsend / receive生产者 send.py 的核心调用链channel.queue_declare(queuehello, durableTrue, arguments{x-queue-type: quorum}) channel.basic_publish(exchange, routing_keyhello, bodyHello World!)消费者 receive.py 则通过回调注册消费channel.basic_consume(queuehello, on_message_callbackcallback, auto_ackTrue) channel.start_consuming()值得注意的仓库级细节本仓库所有长期队列都以durableTrue声明并显式传入arguments{x-queue-type: quorum}即使用 RabbitMQ 的 quorum 队列类型。这在 Gogo/send.go 中amqp.QueueTypeArg: amqp.QueueTypeQuorum、Javajava/Send.java 中Map.of(x-queue-type, quorum)、C#dotnet/Receive/Receive.cs等移植中保持一致是该仓库在消息可靠性上的统一实践。运行方式先消费后生产各开一个终端python send.py python receive.py4.3 T2 Work Queuesnew_task / worker生产者 new_task.py 引入了消息持久化属性propertiespika.BasicProperties(delivery_modepika.DeliveryMode.Persistent)消费者 worker.py 则是工作队列三要素的完整示范channel.basic_qos(prefetch_count1) # 公平分发一次只取一条 def callback(ch, method, properties, body): time.sleep(body.count(b.)) # 用消息中的 . 数量模拟耗时 ch.basic_ack(delivery_tagmethod.delivery_tag) # 手动确认 channel.basic_consume(queuetask_queue, on_message_callbackcallback)prefetch_count1避免消息堆积在某个空闲 worker 上实现 round-robin 基础上的公平分发手动 ack 保证 worker 崩溃后消息可重新入队。C# 移植 dotnet/Worker/Worker.cs 以await channel.BasicQosAsync(prefetchSize: 0, prefetchCount: 1, global: false)与BasicAckAsync呈现同一模式。运行示例来自 python/README.mdpython new_task.py A very hard task which takes two seconds.. python worker.py4.4 T3 Publish/Subscribeemit_log / receive_logsfanout 交换机生产者 emit_log.py 声明fanout 类型交换机并向其发布channel.exchange_declare(exchangelogs, exchange_typefanout) channel.basic_publish(exchangelogs, routing_key, bodymessage)消费者 receive_logs.py 使用临时独占队列并绑定到交换机result channel.queue_declare(queue, exclusiveTrue) # 服务端生成随机队列名 queue_name result.method.queue channel.queue_bind(exchangelogs, queuequeue_name)exclusiveTrue的匿名队列在消费者断开后自动删除每个订阅者都收到全量副本这是广播日志场景的标准做法。Go 移植 go/receive_logs.go 中ch.QueueDeclare(, false, false, true, false, nil)的exclusivetrue参数与之对应。运行python receive_logs.py python emit_log.py info: This is the log message4.5 T4 Routingemit_log_direct / receive_logs_directdirect 交换机生产者 emit_log_direct.py 把日志级别作为 routing keychannel.exchange_declare(exchangedirect_logs, exchange_typedirect) severity sys.argv[1] if len(sys.argv) 2 else info channel.basic_publish(exchangedirect_logs, routing_keyseverity, bodymessage)消费者 receive_logs_direct.py 支持一次绑定多个级别实现选择性接收for severity in severities: channel.queue_bind(exchangedirect_logs, queuequeue_name, routing_keyseverity)direct交换机的规则是routing key 完全匹配才投递。Go 移植 go/receive_logs_direct.go 用ch.QueueBind(q.Name, s, logs_direct, false, nil)在循环中完成多绑定。运行python receive_logs_direct.py info python emit_log_direct.py info The message4.6 T5 Topicsemit_log_topic / receive_logs_topictopic 交换机生产者 emit_log_topic.py 使用topic类型交换机routing key 形如anonymous.infochannel.exchange_declare(exchangetopic_logs, exchange_typetopic) routing_key sys.argv[1] if len(sys.argv) 2 else anonymous.info消费者 receive_logs_topic.py 使用通配符绑定键binding keyfor binding_key in binding_keys: channel.queue_bind(exchangetopic_logs, queuequeue_name, routing_keybinding_key)topic 交换机的匹配规则是*匹配一个单词#匹配零个或多个单词。这与 swift/README.md 中对kern.*、*.critical、#等模式的解释完全一致。运行python receive_logs_topic.py *.rabbit python emit_log_topic.py red.rabbit Hello4.7 T6 RPCrpc_server / rpc_client回调队列 correlationId这是六课中模式最完整的一课。服务端 rpc_server.py 消费rpc_queue通过props.reply_to回发结果并原样带回props.correlation_idch.basic_publish(exchange, routing_keyprops.reply_to, propertiespika.BasicProperties(correlation_idprops.correlation_id), bodystr(response)) ch.basic_ack(delivery_tagmethod.delivery_tag)客户端 rpc_client.py 是FibonacciRpcClient类启动时声明匿名回调队列并消费之每次call(n)生成唯一uuid4()作为correlation_id携带reply_to发布请求随后用connection.process_data_events(time_limitNone)阻塞等待响应并在on_response中按 correlation_id 过滤属于自己的结果result self.channel.queue_declare(queue, exclusiveTrue) self.callback_queue result.method.queue self.corr_id str(uuid.uuid4()) propertiespika.BasicProperties(reply_toself.callback_queue, correlation_idself.corr_id)RPC 的四要素——回调队列、correlationId、reply-to、超时/过滤——在 Go 移植 go/rpc_client.go 中同样齐全ReplyTo: q.Name、CorrelationId: corrId且randomString(32)生成 correlation id。运行python rpc_server.py python rpc_client.py五、T7 Publisher Confirms三种确认策略的源码级对比T7 是 AMQP 0-9-1 教程中唯一单向的一课专讲发布者确认。Go 移植 go/publisher_confirms.go 把三种策略完整实现并同进程跑完是理解该主题的最佳源码逐条同步确认handlePublisherConfirmsIndividually每发一条调用confirm.WaitContext(ctx)等待确认。源码注释直言 The slowest option, consider using other options instead吞吐最低。批量同步确认handlePublisherConfirmsInBatches以batchSize 100为一批统一等待每个DeferredConfirmation仍能精确定位被 nack 的消息吞吐显著提升。异步确认handlePublisherConfirmsAsynchronously通过ch.NotifyPublish(...)订阅确认流用sync.Map记录未确认消息注释明确 use this option when possible是官方推荐的最高吞吐方案。三个函数共享openConfirmChannelch.Confirm(false)将通道置入 confirm 模式。另外注意confirmTimeout 5 * time.Second的注释约束must not be lower than the heartbeat timeout不能低于心跳超时。Java 侧的佐证更加完善java-mvn/src/test/java/PublisherConfirmsTest.java 是围绕 T7 的 JUnit 测试套件覆盖publish messages individually、publish messages in batch、allow max of outstanding confirms信号量限制未确认上限、resend unconfirmed messagesnack 后重发等场景并使用confirmSelect()waitForConfirmsOrDie(5000)addConfirmListener(handleAck, handleNack)系列 API。测试还通过 Mockito 模拟服务端随机 ack/nack/multiple 来可靠验证确认处理逻辑。运行方式各语言一致以 Go 为例go run publisher_confirms.go六、Spring AMQP 移植Profile 驱动的六合一应用spring-amqp/README.md 提供了一种截然不同的组织方式六个教程合并在一个 CLI 应用中通过 Spring Profiles 切换行为。每个教程由 sender、receiver、configuration 三个类组成如 Tut2Config.java 使用Profile({tut2, work-queues})并以QueueBuilder.durable(task_queue).quorum()声明 quorum 队列。构建与运行./mvnw clean package java -jar target/rabbitmq-tutorials.jar --spring.profiles.activework-queues,senderProfile 组合规则{tut1|hello-world},{sender|receiver}、{tut2|work-queues},{sender|receiver}、{tut3|pub-sub|publish-subscribe},{sender|receiver}、{tut4|routing},{sender|receiver}、{tut5|topics},{sender|receiver}、{tut6|rpc},{client|server}。直接运行 jar 不带参数会打印全部 12 条可用命令。两个重要配置项运行时长接收端/服务端默认可能很快退出通过--tutorial.client.duration60000拉长运行窗口远程连接默认连 localhost启用remoteprofile 会加载application-remote.yml中的属性可按如下方式覆盖spring: rabbitmq: host: rabbitmq-server username: tutorial-user password: tutorial-user七、Stream 协议移植send/receive 与 Offset Tracking带-stream后缀的目录覆盖 RabbitMQ Stream 协议前置条件是启用 Stream 插件的 RabbitMQ 节点见 go-stream/README.md 与 javascript-nodejs-stream/README.md 对插件启用文档的引用。各移植提供两对示例第一对send/receiveHello World 的 Stream 版第二对offset_tracking_send/offset_tracking_receiveOffset Tracking消费位点追踪。以 python-stream/README.md 为例使用qweeze/rstream客户端pip3 install -r requirements.txt python3 send.py python3 receive.py python3 offset_tracking_send.py python3 offset_tracking_receive.pyGo 侧 go-stream/ 使用rabbitmq/rabbitmq-stream-go-clientRust 侧 rust-stream/ 使用rabbitmq-stream-client运行方式均为go run/cargo run --bin。八、AMQP 1.0 移植面向 RabbitMQ 4.x 的新客户端除经典的 AMQP 0-9-1 外仓库还提供了基于AMQP 1.0 协议的移植java-amqp/RabbitMQ AMQP 1.0 Java client要求 RabbitMQ 4.0 或更新版本AMQP 1.0 默认在 5672 端口启用dotnet-amqp/RabbitMQ.AMQP.ClientNuGet面向 RabbitMQ 4.x支持dotnet run -f net8.0 --project ...方式逐教程运行并附端到端冒烟测试脚本 test-tutorials.sh。dotnet-amqp/README.md 还介绍了 AMQP 1.0 特有的Direct Reply-To RPC在 RabbitMQ 4.2 上.NETRequester在未显式设置回复队列时自动使用 Direct Reply-To旧版本则回退到临时回复队列对应示例为RpcAmqp10。go/README.md 中同样有go run rpc_amqp10.go的 Direct Reply-To ping/pong 示例依赖 go.mod 中的github.com/Azure/go-amqp v1.5.0。Java 侧 Amqp10TutorialIntegrationTest.java 则以集成测试形式验证了 AMQP 1.0 客户端的队列声明、发布订阅、quorum 队列等行为测试要求 localhost 上有 broker。九、如何验证仓库自带的跨语言测试体系仓库提供了多层级的可执行验证手段可以作为你本地跑通教程后的对拍工具根目录 test.py一个跨语言端到端测试驱动为 T1–T6 分别生成各语言的 send/recv 命令对随机参数后启动消费者、运行生产者、发送 SIGINT 并用正则匹配输出如 T6 期望fib[(]30[)]。可通过环境变量TUTORIALStut1,tut2,...指定测试集、SLOWNESS调节等待系数。它还会对 Clojure 的 Leiningen 启动做额外的等待补偿。go-amqp/test-tutorials.shGo AMQP 1.0 教程的冒烟测试脚本依次验证 T1Hello World、T2工作队列 e2e、T3广播、T4路由warn、T5topickern.*、T6fib(10)55、Publisher Confirms 与rpc_amqp10的 ping/pong。脚本会先探测localhost:5672连通性可用SKIP_BROKER_CHECK1跳过探测但测试本身仍需要 broker。java-mvn/src/test/java/PublisherConfirmsTest.java与 java-amqp/src/test/java/Amqp10TutorialIntegrationTest.java面向单语言行为的 JUnit 集成测试分别覆盖 T7 确认策略与 AMQP 1.0 客户端行为。十、许可证仓库以 Apache License 2.0 发布根 README.md 的 License 章节。这意味着你可以自由地阅读、运行、修改这些教程代码用于学习或内部工程参考。结语rabbitmq-tutorials的价值在于概念看官网、代码看仓库的双轨结构无论你主力语言是 Python、Go、Java、.NET、Rust、Ruby 还是其他小众语言都能在这里找到与官方教程编号一一对应的可运行实现并且各移植在 quorum 队列、持久化、手动 ack、prefetch、correlationId 等关键实践上高度一致。建议的进阶路径是先以 python/ 或 go/ 通读 T1–T7 源码建立整体认知再用仓库自带的 test.py 或各目录的冒烟测试脚本交叉验证最后对照官网教程补齐每个概念背后的设计动机。赞分享示例工程【免费下载链接】rabbitmq-tutorialsTutorials for using RabbitMQ in various ways项目地址https://gitcode.com/gh_mirrors/ra/rabbitmq-tutorials点击查看免费下载相关推荐RabbitMQ Tutorials全解析20编程语言实现消息队列实战指南RabbitMQ是一个功能强大的开源消息中间件软件它实现了高级消息队列协议AMQP为分布式系统提供了可靠的消息传递机制。本文将深入解析rabbitmq示例工程深度解析Jeecg-Boot微服务架构的CORS跨域配置与安全实践深度解析Jeecg Boot微服务架构的CORS跨域配置与安全实践 Jeecg Boot作为一款领先的AI低代码开发平台在微服务架构下提供了完整的CORS跨域低代码后端前端AI 应用大模型RAG工作流自动化突破消息传递瓶颈RabbitMQ多语言实战指南突破消息传递瓶颈RabbitMQ多语言实战指南 RabbitMQ作为一款高性能的消息队列Message Queue中间件被广泛应用于分布式系统中的异步通示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?