求小伙伴们,推荐一款 c/c++成熟高性能的队列,谢谢

2018-04-29 11:00:01 +08:00
 duanhui8
场景:200-400 线程同时向队列中写入消息,每秒写入次数大概 7000+,每次写入 100 byte 左右
消费端,由多线程消费,将消息取出并通过 socket 发送出去。

小伙伴有没有高性能的队列推荐啊?要支持多线程读写,并且要安全,性能尽量好点,c/c++代码
另外这种场景非阻塞队列更适合吧?
不想去百度,怕被坑,求小伙伴们推荐,谢谢
8548 次点击
所在节点    程序员
45 条回复
pynix
2018-04-29 11:05:29 +08:00
zmq?
lsmgeb89
2018-04-29 11:14:23 +08:00
boost 里好像有个 lock-free 的,但没研究过。
duanhui8
2018-04-29 11:17:56 +08:00
@pynix 已经集成了 nanomsg,但是发布消息时间太长,导致用户线程 wait,所以考虑再接一个队列,用户线程只向队列写消息,有其他线程负责取数据发送。
duanhui8
2018-04-29 11:18:50 +08:00
@pynix 另外 zmq 的多线程不安全,会导致 double free 内存,昨天刚踩的坑
hncqp
2018-04-29 11:23:32 +08:00
同机器的话,手写
duanhui8
2018-04-29 11:24:28 +08:00
@lsmgeb89 嗯嗯,正在测试 lock-free,第一次使用 boost 库,正在研究,所以对性能,原理机制都不太清楚
orafy
2018-04-29 11:26:13 +08:00
每秒 7000+的写入,还是多线程不需要考虑高性能。
优先考虑易用性,可以考虑 folly 库里的 MPMCQueue
duanhui8
2018-04-29 11:27:02 +08:00
@hncqp 大神,小弟技术有限,自己写 是给自己挖坑啊,这程序要求比较高,出错的后果很严重
有什么推荐的吗?有现成的代码也行^_^
htfy96
2018-04-29 11:27:59 +08:00
如果 N 个消费者等价的话不如开 N 个队列,生产的时候 round-robin 到 N 个队列中的 1 个。用自旋锁+sched_yield 保护队列,感觉对 7k qps 的情况应该还能撑过去
duanhui8
2018-04-29 11:29:30 +08:00
@orafy 嗯嗯,好的,我先研究一下,谢谢
htfy96
2018-04-29 11:30:41 +08:00
不等价的话楼上的 folly::MPMCQueue 是个比较成熟的方案,不过性能可能没有 round-robin + MPSCQueue 高
duanhui8
2018-04-29 11:38:08 +08:00
@htfy96 嗯嗯,多个队列,应该可以降低多线程对单队列并发争用,是个思路,谢谢
duanhui8
2018-04-29 11:41:25 +08:00
@htfy96 MPMCQueue 相比 boost lockfree 如何呢?没经验,谢谢指点^-^
htfy96
2018-04-29 11:50:13 +08:00
@duanhui8 boost::lockfree Boost 1.53 加入的,个人觉得还不太成熟。不过对你这个情景应该够用了
duanhui8
2018-04-29 11:53:48 +08:00
@htfy96 tank you
feverzsj
2018-04-29 11:57:59 +08:00
要数据安全,只能用基于数据库的消息队列,其他消息队列都无法保证数据不丢失
duanhui8
2018-04-29 12:03:51 +08:00
@feverzsj 审计信息,丢个几条也没事。加队列 主要是不能让用户线程 wait 太长,提高响应。队列性能最好高点,然后保障多线程安全,就可以了
hncqp
2018-04-29 13:19:16 +08:00
@duanhui8 7000qps 不算高
开源的不太了解
我们这边都是自己造轮子,3w 多 qps
简单点的话读写锁加 queue 然后加个 eventfd 通知
或者环形队列实现
要不然上个 kafka
forestyuan
2018-04-29 13:19:20 +08:00
不知道你的程序运行在什么操作系统上,如果是 Windows 的话,Microsoft Message Queue 应该能满足你的要求
gabon
2018-04-29 13:45:18 +08:00
ringbuffer 了解一下,可以参考 java 的 disruptor 实现。底层是个环形数组,用硬件 cas 竞争写入,无锁。开发者测试每秒 600w 订单。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/450852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX