一 应用场景
有很多业务, 客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网,
那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据
都能被处理, 但实效性不够.
通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,
把客户端看做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
从测试结果来看, 消息队列的读写性能都非常不错, 应该能够满足很多应用的需求
- 大小: 14.9 KB
- 大小: 13.5 KB
- 大小: 16.3 KB
- 大小: 21.7 KB
分享到:
相关推荐
此文档是C#开发的消息队列系统,适用于消息队列入门与新手。 在Windows 7 上安装消息队列的步骤 打开“控制面板”。 单击“程序”,然后在“程序和功能”下, 单击“打开或关闭 Windows 功能”。 -或者-单击“经典...
发送端读取指定的文件,并且按照环境变量中设置的消息队列键值进行发送。如果要改代码,只要把键值改一下,结构体储存要发送的消息的那个数组对应改成自己想发送的值,就可以很好的实现功能。接收端同样按环境变量...
实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_...
进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
C#消息队列发送及接收
消息队列中间件调研文档。ActiveMQ、RabbitMQ、RocketMq、Joram、HornetQ、OpenMQ等的对比。
FreeRTOS PPT_消息队列的介绍,本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队列在实际项目中应用较多。 消息队列的概念及其作用 消息队列就是通过RTOS 内核提供的...
亲测可用的基于Linux消息队列的简易聊天室(C语言)(附源代码)采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信...
C++封装实现的异步加锁消息队列,支持多线程,完美封装,可用于消息接收、处理
Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息...
博文a 中的老师,提供了Redis 实现消息队列的整体思路,言简意赅,但部分类库a 老师并未提供,因此我参照了博文b 中老师的RedisHelper 类,主要借鉴的方法为ListLeftPop及ListRightPush,及实现消息队列的核心思想,...
描述ucOS消息队列的使用,此文网络截文,感谢原创作者。
解决 “消息队列不可用 ” 附加案例 :消息队列异步接收 消息队列局域网发送与接收
RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列
消息队列工具,这是一个在查看消息队列中消息的一个很好的工具软件。
进程与消息队列进程与消息队列简单例进程与消息队列进程与消息队列简单例进程与消息队列进程与消息队列简单例进程与消息队列进程与消息队列简单例进程与消息队列进程与消息队列简单例
采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信。 Linux IPC通信利用消息队列消息机制,多线程通信,字符串...
消息队列 Queue与Topic区别
C++多线程,消息队列用法,为了凑够20个字,拼了。