当前位置: 首页 > article >正文

消息队列实战:RabbitMQ与ZeroMQ

消息队列实战RabbitMQ与ZeroMQ 概述消息队列是分布式系统中重要的通信组件用于解耦服务、异步处理和流量削峰。本文将介绍两种流行的消息队列技术RabbitMQ和ZeroMQ。 RabbitMQ实战RabbitMQ基础知识RabbitMQ是一个开源的消息代理软件实现了高级消息队列协议AMQP。它的特点包括内存与磁盘控制内存到上限之后会将数据写入磁盘中支持多种消息模式发布/订阅、路由、主题等可靠性高支持消息确认、持久化等机制安装部署Docker方式安装# 获取rabbitmq官方镜像dockerpull rabbitmq:3.9.17-management# 运行容器dockerrun-d--hostnamemy-rabbit--namerabbitmq-3.9.17\--expose15671--expose4369\-p15672:15672\--expose15692--expose25672--expose15691--expose5671\-p5672:5672\--restartalways\-eRABBITMQ_DEFAULT_USERadmin\-eRABBITMQ_DEFAULT_PASSadmin\rabbitmq:3.9.17-management访问Web管理界面http://192.168.4.11:15672账号admin/adminC客户端代码示例消费者代码// Copyright 2007 - 2021, Alan Antonuk and the rabbitmq-c contributors.// SPDX-License-Identifier: mit#includestdint.h#includestdio.h#includestdlib.h#includestring.h#includerabbitmq-c/amqp.h#includerabbitmq-c/tcp_socket.h#includeassert.h#includeutils.h#defineSUMMARY_EVERY_US1000000staticvoidrun(amqp_connection_state_tconn){uint64_tstart_timenow_microseconds();intreceived0;intprevious_received0;uint64_tprevious_report_timestart_time;uint64_tnext_summary_timestart_timeSUMMARY_EVERY_US;amqp_frame_tframe;uint64_tnow;for(;;){amqp_rpc_reply_tret;amqp_envelope_tenvelope;nownow_microseconds();if(nownext_summary_time){intcountOverIntervalreceived-previous_received;doubleintervalRatecountOverInterval/((now-previous_report_time)/1000000.0);printf(%d ms: Received %d - %d since last report (%d Hz)\n,(int)(now-start_time)/1000,received,countOverInterval,(int)intervalRate);previous_receivedreceived;previous_report_timenow;next_summary_timeSUMMARY_EVERY_US;}amqp_maybe_release_buffers(conn);retamqp_consume_message(conn,envelope,NULL,0);if(AMQP_RESPONSE_NORMAL!ret.reply_type){if(AMQP_RESPONSE_LIBRARY_EXCEPTIONret.reply_typeAMQP_STATUS_UNEXPECTED_STATEret.library_error){if(AMQP_STATUS_OK!amqp_simple_wait_frame(conn,frame)){return;}if(AMQP_FRAME_METHODframe.frame_type){switch(frame.payload.method.id){caseAMQP_BASIC_ACK_METHOD:/* 发布者确认消息 */break;caseAMQP_BASIC_RETURN_METHOD:/* 消息无法路由时的返回处理 */{amqp_message_tmessage;retamqp_read_message(conn,frame.channel,message,0);if(AMQP_RESPONSE_NORMAL!ret.reply_type){return;}amqp_destroy_message(message);}break;caseAMQP_CHANNEL_CLOSE_METHOD:/* 通道异常关闭 */return;caseAMQP_CONNECTION_CLOSE_METHOD:/* 连接异常关闭 */return;default:fprintf(stderr,An unexpected method was received %u\n,frame.payload.method.id);return;}}}}else{printf(Consumer get envelope.message.body.len%d\n,envelope.message.body.len);printf(message: %s\n,envelope.message.body.bytes);amqp_destroy_envelope(envelope);}received;}}intmain(intargc,charconst*const*argv){charconst*hostname;intport,status;charconst*exchange;charconst*bindingkey;amqp_socket_t*socketNULL;amqp_connection_state_tconn;amqp_bytes_tqueuename;if(argc3){fprintf(stderr,Usage: amqp_consumer host port\n);return1;}hostnameargv[1];portatoi(argv[2]);exchangeargv[3];bindingkeyargv[4];queuename.bytes(void*)argv[4];queuename.lenstrlen(argv[4]);printf(queuename %s queuename.len%d\n,(char*)queuename.bytes,queuename.len);connamqp_new_connection();socketamqp_tcp_socket_new(conn);if(!socket){die(creating TCP socket);}statusamqp_socket_open(socket,hostname,port);if(status){die(opening TCP socket);}die_on_amqp_error(amqp_login(conn,/,0,131072,0,AMQP_SASL_METHOD_PLAIN,admin,admin),Logging in);amqp_channel_open(conn,1);die_on_amqp_error(amqp_get_rpc_reply(conn),Opening channel);{amqp_queue_declare_ok_t*ramqp_queue_declare(conn,1,queuename,0,0,0,0,amqp_empty_table);die_on_amqp_error(amqp_get_rpc_reply(conn),Declaring queue);printf(queue name %s\n,queuename.bytes);if(queuename.bytesNULL){fprintf(stderr,Out of memory while copying queue name);return1;}}amqp_queue_bind(conn,1,queuename,amqp_cstring_bytes(exchange),amqp_cstring_bytes(bindingkey),amqp_empty_table);die_on_amqp_error(amqp_get_rpc_reply(conn),Binding queue);printf(queuename %s queuename.len%d\n,(char*)queuename.bytes,queuename.len);amqp_basic_consume(conn,1,queuename,amqp_empty_bytes,0,1,0,amqp_empty_table);die_on_amqp_error(amqp_get_rpc_reply(conn),Consuming);run(conn);amqp_bytes_free(queuename);die_on_amqp_error(amqp_channel_close(conn,1,AMQP_REPLY_SUCCESS),Closing channel);die_on_amqp_error(amqp_connection_close(conn,AMQP_REPLY_SUCCESS),Closing connection);die_on_error(amqp_destroy_connection(conn),Ending connection);return0;}运行示例# 生产者./amqp_producer192.168.4.11567299999999999# 消费者./amqp_consumer192.168.4.115672amq.topicjpg_queue使用要点生产者发送消息并不用指定queue名其根据Exchange类型、Exchange名、Binding key将消息发送到queueExchange类型在建立的时候已经确定Exchange名和Binding key在发送消息的时候作为参数传过去消费者在消费的时候需要指定Exchange名、Binding key和queue名在Fanout类型的Exchange中Binding key不会起作用Exchange会在消息发送到与其绑定的各个队列auto delete的队列必须是有过消费者并且所有消费者都解除订阅了才会auto deleteExchange也是这样⚡ ZeroMQ实战简介ZeroMQ也称ZMQ、0MQ是一个高性能的异步消息库旨在用于可扩展的分布式或并发应用程序。它提供了一个消息队列但与面向消息的中间件不同ZeroMQ可以在无需专用消息代理的情况下运行。典型使用场景当作普通TCP使用比自己写socket要简单、可靠使用经验1. ZeroMQ Socket不支持多线程ZeroMQ的socket不支持多线程不能将zeromq的socket传到多个线程中然后在多个线程中使用这个socket发送或者接受数据。问题案例解码服务有这样一个需求同一个算法的多个解码任务需要将数据发送到同一个消费者。最开始的想法是创建一个pusher socket再将这个socket传到多个任务中然后利用这个socket进行发送数据但通过实验发现每次只有一个任务能够正常工作其他任务都被阻塞。解决方案创建一个线程专门用来发送数据多个抽帧解码任务将数据放入到一个全局的队列中发送线程从这个队列中取数据进行发送这样就做到了一个zeromq socket只被一个线程使用。也可以考虑全部使用zeromq来实现灵活的架构。由此可以看出zeromq可以设计出非常灵活的架构2. PUSH/PULL模式阻塞问题push/pull模式当没有pull的时候push会被send函数阻塞。3. PUB/SUB vs PUSH/PULL模式区别模式消息分发方式PUB/SUB同一个数据会被传送给多个sub一对多PUSH/PULL一个数据只会给一个pull即一个数据只会被消费一次负载均衡 RabbitMQ vs ZeroMQ对比特性RabbitMQZeroMQ架构需要Broker消息代理无需Broker点对点通信可靠性高支持消息确认和持久化较低依赖应用层实现性能较高极高功能丰富的消息模式和管理功能轻量级模式相对简单部署需要部署和运维RabbitMQ服务无需额外部署适用场景企业级应用需要消息可靠性和管理功能高性能场景分布式系统内部通信 选择建议选择RabbitMQ的场景需要消息持久化和可靠性保证需要复杂的消息路由需要消息管理界面企业级应用对消息可靠性要求高选择ZeroMQ的场景追求极致性能分布式系统内部通信不需要消息代理的轻量级场景可以接受应用层实现可靠性机制 参考资料RabbitMQRabbitMQ基础知识介绍内存与磁盘控制消息自动删除参考ZeroMQ入门介绍各种模式介绍、性能对比发布/订阅模式代码参考官方文档GitHub 总结RabbitMQ和ZeroMQ各有优势RabbitMQ适合需要高可靠性和丰富功能的企业级场景ZeroMQ适合追求高性能的轻量级场景。在实际应用中需要根据业务需求、性能要求和团队能力来选择合适的技术。

相关文章:

消息队列实战:RabbitMQ与ZeroMQ

消息队列实战:RabbitMQ与ZeroMQ 📌 概述 消息队列是分布式系统中重要的通信组件,用于解耦服务、异步处理和流量削峰。本文将介绍两种流行的消息队列技术:RabbitMQ和ZeroMQ。 🐰 RabbitMQ实战 RabbitMQ基础知识 Rab…...

【AI面试临阵磨枪-33】Agent 死循环、目标漂移、重复调用如何解决?

一、面试题目AI Agent 开发中经常出现死循环、目标漂移、工具重复调用三大问题,请说明各自产生原因、以及工程上如何彻底解决和规避?二、知识储备1. 概念与产生原因1)Agent 死循环定义Agent 在规划→行动→反思之间无限转圈,反复执…...

异构量子架构设计:突破量子计算不可能三角

1. 异构量子架构的设计哲学与实现路径 量子计算领域正面临一个关键转折点——单一量子硬件平台已无法同时满足容错量子计算(FTQC)对速度、连接性和可扩展性的所有要求。这让我想起早期经典计算从单一CPU向CPU-GPU异构架构的演进历程。在量子领域&#xf…...

【AI面试临阵磨枪-32】如何提升工具调用(Function Call)准确率?常见失败场景与解决方法

一、面试题目 请你说明如何提升大模型 Function Call(工具调用) 准确率?常见的失败场景有哪些?分别怎么解决? 二、知识储备 1. 核心结论(面试必背) 提升 Function Call 准确率,本…...

LOLIN C3 Pico开发板:RISC-V物联网开发实战解析

1. LOLIN C3 Pico开发板深度解析作为一名长期使用ESP32系列开发板的物联网开发者,当我第一次拿到LOLIN C3 Pico时,立刻被它精巧的设计所吸引。这款仅有25.425.4mm见方的开发板,完美继承了Wemos/LOLIN系列一贯的紧凑风格,却在有限的…...

嵌入式——认识电子元器件——温度开关系列

温度开关温度开关介绍核心原理核心参数 & 对应单位常用专业名词介绍核心作用 & 功能用途1. 家用电器(用量最大)2. 工业电气设备3. 锂电与数码电源4. 汽车与新能源5. 工控与精密设备优缺点优点缺点温度开关 VS 温度保险丝 VS 热敏电阻 简易区分分…...

同态加密中多输入密文乘法的优化技术与硬件实现

1. 同态加密与密文乘法基础同态加密(Homomorphic Encryption, HE)技术允许在加密数据上直接进行计算操作,而无需事先解密。这项技术为云计算、医疗数据分析等需要隐私保护的场景提供了革命性的解决方案。在众多同态加密方案中,RNS…...

CF刷题记录及题解

1.CF2201D去除公共部分,要求是两段等长区间内的数集一致,其贡献即左/右端点距离之差。定义 $d$ 是两个相等元素的最远距离,一个显然的下界是 $Max d$。2.CF2201F1/2思维转化后线性维护LHS和RHS即可3.CF2201E转化题意为经典模型式子后使用NTT加…...

掌握扣子AI这6个核心模块,学生党、职场人高效通关

前言:不管是学生党被课程、论文追着赶,还是职场人被会议、工作文件耗心力,高效工具总能帮我们摆脱焦虑。作为兼顾课程、论文和实习的大三学生,我吃透了扣子AI 6大核心模块,亲测它适配校园与职场,既能帮学生…...

从一次深夜告警说起:手把手复盘Kafka 3.5.1集群SASL认证的完整配置流程与避坑点

从一次深夜告警说起:手把手复盘Kafka 3.5.1集群SASL认证的完整配置流程与避坑点 凌晨2:15,手机突然震动起来——监控系统发出Kafka集群认证失败的告警。作为负责生产环境稳定的SRE,这种深夜告警总是让人心跳加速。登录系统查看日志&#xff0…...

避开小米刷机坑:详解‘remote not allowed in locked state’与Bootloader解锁的完整流程(2024最新)

2024小米手机Bootloader解锁全流程避坑指南:从申请到刷机零失误 第一次给小米手机解锁Bootloader时,那种既兴奋又忐忑的心情我至今记得——就像拿到一把能打开新世界的钥匙,但稍有不慎就可能把手机变成"砖块"。去年帮朋友抢救一台因…...

如何通过4步诊断和修复TranslucentTB在Windows更新后的启动失败问题

如何通过4步诊断和修复TranslucentTB在Windows更新后的启动失败问题 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 当Windows系统更新后…...

京东自动抢购终极指南:2025年高效补货监控与多账户下单技术解析

京东自动抢购终极指南:2025年高效补货监控与多账户下单技术解析 【免费下载链接】Jd-Auto-Shopping 京东商品补货监控及自动下单 项目地址: https://gitcode.com/gh_mirrors/jd/Jd-Auto-Shopping 在电商购物日益激烈的今天,抢购热门商品往往成为技…...

现代化python工具

如果python版本不兼容会很难受。解决python的依赖管理。IDEIDE使用:收缩列表使用安装主题安装图标插件:用来引用文件使用的:/代码美化使用的:底层uv现代快速python包管理器:用rust编写的,安装速度展示&…...

Heretic-v1.2.0烧蚀GLM4.7,离线环境进行

Heretic烧蚀,离线环境主要是解决操作过程中从互联网拉取数据集问题使用最终结果各AI模型对这个结果的结论:豆包:ds:chatgpt新模型还需要编译安装transformers主要是解决操作过程中从互联网拉取数据集问题 项目github地址:https:/…...

注入灵魂:从架构设计到数据能力的“降维打击”

目录 前言一、 数据建模:定义系统的“基因”💡 架构映射:低代码 vs 代码 二、 工程化流水线:从模型到可用数据2.1 配置自动化填充(Seed)2.2 发布数据源 三、 核心实现:封装“低代码级别”的分页…...

Windows 10上Hadoop 3.3.6环境搭建踩坑实录:从winutils到IDEA配置一条龙

Windows 10上Hadoop 3.3.6环境搭建实战指南:从零到IDEA集成 在Windows系统上搭建Hadoop开发环境,是许多大数据初学者的必经之路。不同于Linux环境,Windows平台会遇到一系列特有的兼容性问题,从winutils缺失到权限配置&#xff0c…...

XUnity.AutoTranslator:让Unity游戏瞬间跨越语言障碍的终极解决方案

XUnity.AutoTranslator:让Unity游戏瞬间跨越语言障碍的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 想象一下,你刚刚下载了一款日系RPG游戏,精美的画面…...

从祖冲之到牛顿迭代法:图解那些被我们遗忘的‘笨’办法如何逼近根号2

从几何直觉到迭代算法:人类逼近根号2的千年智慧之旅 数学史上最迷人的故事之一,就是人类如何用各种巧妙的方法逼近那个无限不循环的小数——根号2。这个看似简单的数学常数,却凝聚了东西方文明几千年的智慧结晶。让我们暂时放下现代计算器的便…...

人生是一场心智游戏,而大多数人连规则都没搞清楚

你有没有经历过这种循环:某天被一段话、一本书、一个视频点燃,觉得这次真的要变了。你开始健身、开始学习、开始做那件拖了很久的事。然后两周后,你回到了原点。你把这归因于意志力不够、自律太差、执行力弱。但这个诊断本身就是错的。最近读…...

手机号查QQ号终极指南:3分钟掌握高效查询技巧

手机号查QQ号终极指南:3分钟掌握高效查询技巧 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾需要快速确认手机号对应的QQ号,却苦于没有简单直接的查询方法?手机号查QQ号工具正是为你量身…...

Ubuntu 22.04 + Python 3.10 环境,手把手教你搞定 nnUNetV2 和 MSD 数据集预处理

Ubuntu 22.04 Python 3.10 环境下的 nnUNetV2 与 MSD 数据集全流程实战指南 在医学图像分割领域,nnUNetV2 以其出色的自适应能力和稳定的表现,成为众多研究者和开发者的首选工具。本文将带你从零开始,在 Ubuntu 22.04 系统和 Python 3.10 环…...

【IT研发实用Skill】clickhouse-io 技能

ClickHouse数据库模式、查询优化、分析和数据工程最佳实践,适用于高性能分析工作负载。 技能概述 clickhouse-io 技能提供了ClickHouse列式数据库的专门开发模式和最佳实践。ClickHouse是一个面向列的数据库管理系统(DBMS),专为在线分析处理(OLAP)而优化,特别适合处理大规模数…...

魔兽争霸3终极性能优化指南:WarcraftHelper完整配置让帧率稳定180+

魔兽争霸3终极性能优化指南:WarcraftHelper完整配置让帧率稳定180 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争…...

25个免费Illustrator脚本终极指南:快速提升设计效率300%

25个免费Illustrator脚本终极指南:快速提升设计效率300% 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 你是否厌倦了在Adobe Illustrator中重复执行相同的操作&#xf…...

《Windows Internals》读书笔记 10.4.3:WMI 仓库(Repository)——它到底存了什么,又不存什么?

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

蓝桥杯省赛真题解析:用线段树+优先队列搞定‘小蓝的旅行计划’(附Java完整代码)

蓝桥杯省赛算法精解:线段树与优先队列在旅行加油问题中的协同应用 第一次看到"小蓝的旅行计划"这道题时,很多选手会被题目中复杂的加油规则和油箱限制条件弄得晕头转向。这道来自蓝桥杯省赛的真题,表面上看是一个简单的贪心问题&am…...

倚天剑术46--批量转换其他图片格式为jpg

JPG格式和其他格式相比最大的优点是:保持一定清晰度的基础上具备极高的压缩性。从笔者非专业的角度认为,其实JPG文件除了不支持透明度,其他方面都挺好。因此只要没有透明度的需求,我一般会把图片转换成JPG,占用的空间的…...

Labelme标注数据清洗实战:用Python批量重命名、替换和删除特定标签(附完整代码)

Labelme标注数据清洗实战:Python自动化处理标签体系的三大核心场景 当你完成一轮图像标注后,突然发现标签体系需要调整——可能是命名不规范需要统一,可能是类别定义需要修改,甚至是某些冗余类别需要删除。手动修改每个JSON文件不…...

从SimCLR到CLIP:对比学习在CV领域的演进与落地思考(附避坑指南)

从SimCLR到CLIP:对比学习在视觉智能中的范式跃迁与技术实践 当计算机视觉领域还在为标注数据的稀缺性苦恼时,对比学习像一束光照亮了无监督表征学习的道路。从2020年SimCLR的横空出世,到CLIP开启的多模态新时代,这场技术演进不仅重…...