消息队列

任务间通信 | 邮箱、消息队列 本文主要介绍任务间通信机制,通过对邮箱及消息队列进行详细介绍,并对其概念、详细设计、接口设计等的讲解帮助开发者更好的理解其在操作系统中的应用。 阅读详情

一 应用场景

有很多业务, 客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网, 

那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据

都能被处理, 但实效性不够.

 

通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,

把客户端看做producer, 内网看做consumer, 这正是消息队列的用武之地.

客户端先把数据写入外网服务器的消息队列, 然后内网服务器再从消息队列取走数据, 消息队列须满足:

(1) 支持高并发的入队和出队操作, 允许很多客户端同时插入数据, 而且允许内网服务器高频率地取走

      数据

(2) 支持数据的持久化, 为保证速度, 消息队列缓存在内存中, 如果内存不够用了, 则写入磁盘.

(3) 支持一次性插入多条记录, 以及一次性取走多条数据, 这样可以提高传输效率

 

二 技术选型

1 存储方案: Tokyo Cabinet

Tokyo Cabinet数据库是日本最大的社交网站mixi开发的一款Key-Value数据库,之所以选择Tokyo Cabinet,

而不是MySQL, Redis或者Memcached, 这是因为:

 

(1) Tokyo Cabinet的读写速度非常快, 比MySQL快很多, 和Memcached差不多, 比Redis当然慢一截,

      有测试数据为证:

写入100万条:tcbtest write test.tcb 1000000

时间: 0.994秒 速度:100,6036条/秒

写入200万条:tcbtest write test.tcb 2000000

时间: 2.028秒 速度: 98,6193条/秒

写入500万条:tcbtest write test.tcb 5000000

时间: 5.276秒 速度: 94,7687条/

 

(2) Tokyo Cabinet占用内存不大, 而且支持数据的持久化, 用户可以设定内存缓存的大小, 缓存不够用

     的时候, 就把数据持久化到磁盘

 

2 网络接口: Libevent

Tokyo Cabinet只是一个数据存储层面的东西, 它没有提供网络接口, 所以得写一个http服务器为用户

提供服务.对于高并发的服务器来说, 基于事件驱动的libevent网络库是非常好的选择. 事实上, libevent

自带了一个简单高效的http服务器实现, 对于消息队列服务器来说足够使用了. 代码不足400行.

 

 

三 如何使用

用户使用http的get请求来操作消息队列. 参数如下

o: 操作参数, 取值为{get|set|status}, set表示入队,get表示出队, status查看队列的状态

m: 消息数据.

p: 密码参数或者校验参数

n: 一次入队n条消息, 或者出队n条消息

 

1 入队

http://localhost:3333/dsr?o=set&d=foobar|hello|world

把foobar, hello, world三条消息插入队列,消息之间用"|"号隔开,若成功入队, 服务端返回0#0

 

 

2 出队

http://localhost:3333/dsr?o=get&n=10

从队列中取出10条消息, 每条消息以换行符隔开.

 

 

3 状态

http://localhost:3333/dsr?o=status

查看队列的状态,显示队列的容量, 当前消息数量, 队列头指针, 队列尾指针:

 

 

四 压力测试

测试环境 : 8核CPU

1 入队操作

1000并发量, 插入10万条消息, 每条消息512字节

* 使用keep-alive

测试结果:21246 qps, 占用磁盘空间: 51M

* 不使用keep-alive

测试结果:12768 qps, 占用磁盘空间: 51M

 

2 出队操作

1000并发量, 每次取走一条消息, 取10万次

* 使用keep-alive

测试结果: 27709 qps

* 不使用keep-alive

测试结果: 11461 qps

 

从测试结果来看, 消息队列的读写性能都非常不错, 应该能够满足很多应用的需求

【基础篇-消息队列】——为什么需要消息队列 本文探讨了消息队列的核心作用与应用场景。文章重点分析了消息队列的三大典型应用:1)异步处理,以秒杀系统为例说明如何提升响应速度;2)流量控制,介绍令牌桶等削峰填谷方法保护系统;3)服务解耦,通过订单系统案例说明如何降低模块间耦合度。同时也指出消息队列可能带来的延迟增加、系统复杂度提升等问题。文章强调架构设计需要权衡利弊,根据业务特点选择合适方案。 阅读详情

相关推荐

POSIX 消息队列

一、什么是 POSIX 消息队列?POSIX 消息队列 是一种用于进程间通信(IPC)的技术,它允许不同进程之间通过发送和接收消息来进行通信。POSIX 消息队列是基于 POSIX 标准的一部分,旨在提供跨平台的兼容性和一致性。通俗解释想象一下,你和你的朋友在不同的房间里,你们需要传递信息给对方。传统的做法可能是大喊大叫,但这种方式不太可靠。更好的方法是使用一个小盒子(消息队列),你们可以把信息写在纸上,放进这个盒子里。当你有信息要传递给你的朋友时,你可以把纸条放进盒子;

奋斗在路上的博客 1102

消息队列接口API(posix 接口和 system v接口)

消息队列 posix API 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。信号这种通信方式更像\"即时\"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent);管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑...

weixin_34116110的博客 473

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 727

项目-消息队列设计

模拟实现RabbitMQ

Kai的学习笔记 1436

RK3588开发板实战:从零开始移植Ubuntu 24.04(讯为SDK版)

本文详细介绍了如何在RK3588开发板上从零开始移植Ubuntu 24.04系统(讯为SDK版),涵盖开发环境准备、SDK解析、根文件系统定制、驱动适配、系统集成与烧录等全流程。通过实战案例,帮助开发者快速掌握RK3588开发板的系统移植技巧,适用于嵌入式开发与定制化Linux系统构建。

sand8的博客 437

UE5 StateTree实战:用分层状态机重构你的AI行为逻辑(附蓝图配置避坑点)

本文详细介绍了UE5中StateTree分层状态机的实战应用,帮助开发者重构AI行为逻辑。通过核心概念解析、迁移策略、高级技巧和避坑指南,展示了StateTree在灵活性、可维护性和并行处理方面的优势,特别适合复杂AI行为的开发与优化。

weixin_42558257的博客 249

消息队列设计

消息队列设计 前言 最近被问到这样的问题,如何让你设计一套消息队列,你会从哪些角度去设计。于是我回顾了自己对目前两款主流的消息队列RabbitMQ与Kafka的原理,并收集了一些大佬们对此问题的解答,于是给出了自己的一些理解与认识。 消息队列可参考我的博客溪源的Java笔记—消息队列 正文 消息队列 消息队列要实现的主要功能 解耦:基于消息的模型,关心的是“通知”,而非“处理”,相对而言更关心结果而不是过程,通过消息队列可以减少系统与系统的耦合性,换句话来说一个系统的低效率不会拖累其他系统。 最终一致性:

蹊源的奇思妙想的博客 1148

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

1. 确认corresponding author通讯作者机构是否正确(最好细分到系,如搜不到系只填大学也可)这些信息因为在投稿的时候都填过,所以一般都没问题,可确认并继续。2. Co-Author: 这篇文章有没有其他作者,如果有就选yes,并确认投稿时所填的作者姓名和机构是否正确。这个也是如果前期都填对了就不用修改。3. Research funders: 问文章的研究有没有资助,没有就选no,有就选yes,并填写机构名称和grant/contact numbers。

ZhangJiqun&191cm&85kg 4785

ucosiii 消息队列

我想要验证的是,当没生产一个消息,队列中都会有一个最高优先级的任务就绪,消息会不会被低优先级的任务拿走。(因为cli_Msg是模拟邮箱,只有一个消息的空间,监控他的空间大小意义不大)。然后我把所有xxxxPend函数获取消息后,把消息的内容修改为”is null“,运行后:disp.t1_str出现"is null x",这是我们不想要的结果。所以,还是老老实实地用申请堆上的空间,来存放发送的消息吧,发送前申请空间,xxxxPend周就立刻释放掉空间,而不是使用全局变量。:消息对列,被读走,就没了。

qq_62775800的博客 2258

10、犹豫双模糊TOPSIS算法:原理与实例解析

本文介绍了犹豫双模糊TOPSIS算法的基本原理与应用步骤,结合中国四家纺织公司的案例,详细解析了从构建犹豫双模糊决策矩阵、归一化处理、专家信息聚合,到确定正负理想解、计算距离与相对贴近度系数的完整决策流程。该方法有效应对决策者在评价过程中的犹豫性,适用于财务评估、项目选择等复杂多属性决策场景,具有较强的实用性和推广价值。

yhn45678901的博客 122

一个超酷的开源uHand2.0机械手掌项目

uHand2.0是深圳乐幻索尔公司开源的一款机械手掌,它长下面这个样子:1、uHand2.0外观图之前在公众号就分享过视频:学习嵌入式可以带娃,不信你们看2、uHand2.0硬件原理图看...

Bruce.yang的嵌入式之旅 4460

POSIX消息队列与System V消息队列

是一个结构体,用于描述当消息队列中有新消息时,如何通知进程。:通知方法,取值如下:SIGEV_NONE:不发送任何通知。:发送一个信号事件发生时,将sigev_signo指定的信号发送给指定的进程;:事件发生时,内核会(在此进程内)以sigev_notify_attributes为线程属性创建一个线程,并让其执行sigev_notify_function,并以sigev_value为其参数:当为时,指定要发送的信号。:通知时传递的数据,类型为。:当为时,指定的线程函数。:当为。

v13111329954的博客 1970

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 106

什么是消息队列?

消息队列MQ的主要作用:异步处理,应用解耦,流量削锋和消息通讯

大道至简,持之以恒! 5106

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【消息队列】认识消息队列

生产者消费者模型固然很好,要如何实现呢?此时消息队列就是对生产者消费者模型思想的其中一种实现方式! > 消息队列(Message Queue)是一种在分布式系统中用于组件间通信的技术。它允许应用程序通过发送和接收消息来进行异步通信。逐渐成为解决系统间通信、解耦和负载均衡的重要工具。 概念不好理解很正常,随着你往下看,便能拨开云雾见光明了。 既然叫做消息队列,首先必须得理解什么是消息队列,在数据结构阶段的学习中,肯定学到了一种数据结构叫做队列,队列是一种先进先出的结构,那什么是消息呢?就拿我们常用的通讯

程序猿教你打篮球的博客 6918

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

消息队列和分布式消息队列

存储消息的队列。存储:存数据消息:某种数据结构。比如字符串,对象,二进制数据,JSON等等队列:先进先出的数据结构。

诨号无敌鸭的博客 1647

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【MQ01】什么是消息队列?用哪个消息队列?

什么是消息队列?用哪个消息队列?来了来了,消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀?其实对于搜索引擎来说,我们学习的内容还是挺全面的,也算是比较深入了。而对于消息队列来说,我不准备写得太深入,因为对于这个东西,实战并不算多,主要的原因咱们在今天这篇文章结束的时候再详细的来说吧。先来说概念,到底啥是消息队列?那么多种消息队列工具,或者叫消息队列中间件,我们应该选择哪个呢?我将以...

硬核项目经理 1236

Linux——消息队列

消息队列是一种用于在应用程序之间传递和存储数据的通信机制。它允许应用程序将消息发送到队列中,然后由另一个应用程序从队列中接收和处理这些消息。消息队列可以有效地实现异步通信、解耦应用程序之间的依赖关系,以及实现消息的持久化和顺序处理。常见的消息队列系统包括RabbitMQ、Kafka、ActiveMQ等。消息队列在现代分布式系统和微服务架构中被广泛应用。

m0_74774362的博客 1374

到底什么是消息队列?Java中如何实现消息队列?

网上查了一些资料,感觉都是概念性的很空泛的东西,可是不知道到底是什么东西,如何在Java中实现并使用…… 在此请教各位前辈到底什么是消息队列?Java中如何实现消息队列? 来个个人通俗的解释吧。 消息队列,顾名思义 首先是个队列。 队列的操作有入队和出队 也就是你有一个程序在产生内容然后入队(生产者) 另一个程序读取内容,内容出队(消费者) 这是最最基本的概念。

Golden_lion的博客 1万+

System V消息队列与POSIX消息队列

函数的的oflag类似有 O_RDONLY、O_RDWR, O_WRONLY,除此之外还有 O_CREAT、O_EXCL(如果 O_CREAT 指定,但 name 不存在,就返回错误),O_NONBLOCK(以非阻塞方式打开消息队列,在正常情况下 mq_receive和mq_send 函数会阻塞的地方,使用该标志打开的消息队列会返回 EAGAIN 错误)。通过设置用int mq_notify(),当消息队列从空变为非空 时,已注册的进程将收到一个信号或触发一个回调函数,以异步地通知该进程。

xu_hao430621的博客 1058

什么是消息队列

1、异步处理:一旦生产者发送完消息,便可以立即转向其他任务,而消费者则可以在任何时候开始处理消息。这样一来,生产者和消费者之间就不会发生阻塞。2、削峰填谷:消息队列允许我们先将用户请求存储起来,然后消费者(或说实际执行任务的应用)可以根据自身的处理能力和需求,逐步从队列中取出并处理请求。

cui_hao_nan的博客 986

Linux中消息队列

【代码】Linux中消息队列。

weixin_51034082的博客 838

消息队列-简单介绍Java消息队列,什么是消息队列,作用以及常见消息队列

天天说队列, 项目请求数据不能及时处理时,就一言不合通过队列啊, 心中那个是妈卖批,那么到底什么队列呢,队列有到底运用于哪些运用场景呢; 先说说应用场景吧, 不知道有啥作用,看多了含义,原理什么的还是头疼; 消息队列应用场景 1.比如你的服务器一秒能处理100个订单,但秒杀活动1秒进来1000个订单,持续10秒,在后端能力无法增加的情况下,你可以用消息队列将总共10000个请求压在队列里,后...

香烟达人的博客 2804
上一篇: Struts1、Struts2和SpringMVC
下一篇: 多核 CPU 和多个 CPU 有何区别
时冲
博客等级 码龄15年 12粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值