需求: 金融项目,需要实时行情数据,例如orderbook、ticker等数据,毫秒级延迟, 可以容忍数据少量丢失,对实时性要求最高

对比redis和emitter的发布订阅功能

1. emitter安装使用*

使用docker安装, 方便快捷
docker run emitter/server
2022/03/03 03:13:07 [service] unable to find a license, make sure 'license' value is set in the config file or EMITTER_LICENSE environment variable
2022/03/03 03:13:07 [license] generated new license: PfA8INu7WaoBfpb-R4rkDCyZn77JOSUbnEBvEns5y8JTGWuTEHQXiJVWWd_o0aeCI5WF1ImljurCC-6RvY8IAQ:3
2022/03/03 03:13:07 [license] generated new secret key: Z5XRhZHTFgEMBirqcDB-VIwWNlAjiEUK

上述命令会启动一个container, 然后得到license和secret_key
拿到license我们再启动一个新的容器

docker run -d --name=local-emitter -p 8080:8080 -e EMITTER_LICENSE=PfA8INu7WaoBfpb-R4rkDCyZn77JOSUbnEBvEns5y8JTGWuTEHQXiJVWWd_o0aeCI5WF1ImljurCC-6RvY8IAQ:3 emitter/server

此时得到一个新容器
访问 http://127.0.0.1:8080/keygen 来通过secret_key配置channe及权限,填入我们之前得到的secret_key

配置得到 key: EmB6qR0iiTlebJPYZKmUok7rXx6G36q3 channel: test/

2. redis

docker run -d --name=local-redis -p 6379:6379 redis

3. 简单测试性能(python)

  1. emitter
 pip install emitter-io
# publish.py
import time
import jsonfrom emitter import Clientconn = Client()
conn.connect(host='127.0.0.1', port=8080, secure=False)
key = 'EmB6qR0iiTlebJPYZKmUok7rXx6G36q3'
chan = 'test/'
a = 1
try:while True:data = {'no': a,'ts': time.time() * 1000}conn.publish(key=key, channel=chan, message=json.dumps(data))a += 1
except:conn.disconnect()
# sub.py
import json
import timefrom emitter import Clientdef on_message(m):data = json.loads(m.binary)print(f"{data['no']}: {time.time()*1000 - data['ts']}")conn = Client()
conn.connect(host='127.0.0.1', port=8080, secure=False)key = 'EmB6qR0iiTlebJPYZKmUok7rXx6G36q3'
chan = 'test/'conn.on_message = on_message
conn.subscribe(key=key, channel=chan)
conn.loop_start()
while True:time.sleep(1)

一个pub和一个sub, 测试结果: 延迟越来越大

103919: 352.780029296875
103920: 352.783447265625
103921: 352.786865234375
103922: 352.790283203125
103923: 352.793701171875
.
.
.
147607: 412.2353515625
147608: 412.236572265625
147609: 412.234619140625
  1. redis
# pub.py
import json
import timeimport redisrds = redis.StrictRedis()a = 1
while True:data = {'no': a,'ts': time.time()*1000}rds.publish("test1", json.dumps(data))a += 1
# sub.py
import jsonimport redis
import timerds = redis.StrictRedis()
pubsub = rds.pubsub()pubsub.subscribe('test1')
while True:for item in pubsub.listen():if item['type'] == 'message':item = json.loads(item['data'])print(f'{item["no"]}--{time.time() * 1000 - item["ts"]}')

一个pub和一个sub, 测试结果: 延迟很小,保持稳定

103919--0.078369140625
103920--0.081787109375
103921--0.076416015625
103922--0.0869140625
103923--0.07666015625
.
.
.
115361--0.0732421875
115362--0.071044921875
115363--0.07080078125
115364--0.074951171875
115365--0.091064453125

4. 基本结论

做了最基础的测试,redis对实时数据处理更稳定, 速度更快,emitter没有redis稳定

高性能、分布式、低延迟的发布订阅中间件对比 Redis 和 emitter相关推荐

  1. Sparrow:分布式低延迟调度

    1.摘要 大型数据分析框架正在朝着缩短任务执行时间和提高并行度的方向发展来提供低延迟,任务调度器面临的主要挑战是在几百毫秒内完成高度并行的作业调度,这需要在合适的机器上每秒调度数百万个任务,同时提供毫 ...

  2. 你还不了解Redis的发布/订阅功能与Redis的Stream吗

    一.Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) ...

  3. kafka redis vs 发布订阅_对比平台--Redis Vs Kafka 之间的区别

    Redis和Kafka之间的区别 在本文中,我们将探讨Redis与Kafka之间的最高差异和性能. Redis: Redis是一个内存中的键值数据存储,也是开源的.它可以非常快地用于缓存会话管理,高性 ...

  4. nodejs redis 发布订阅_SpringBoot整合Redis,怎么实现发布/订阅?

    一.简介 1.发布订阅 SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subs ...

  5. redis java 发布订阅_【Redis学习系列】Redis发布订阅

    Redis 发布订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了 ...

  6. 分布式低延迟的调度系统Sparrow详细解读

    0. 前言 Sparrow是一个完全去中心化的调度器,系统中没有中央处理单元,所有的调度器之间也不需要进行通信,根据自己调度器中保留的信息进行调度决策.这种调度方式是集群管理系统的一大改革,其被称为分 ...

  7. 雅虎开源发布/订阅消息平台Pulsar

    雅虎发布了其发布-订阅消息平台Pulsar,这个平台在他们内部已经用在了多项服务的生产环境之中. \\ 按照雅虎的说法,Pulsar是一个低延迟的发布/订阅消息系统,它可以进行水平扩展,跨多个主机和数 ...

  8. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  9. 分布式通信:发布订阅

    分布式通信:发布订阅 前言 什么是发布订阅? 发布订阅的基本工作原理 点对点模式 发布订阅模式. Kafka 发布订阅原理及工作机制 分区和消费组的原理和作用 Broker Consumer 发布订阅 ...

  10. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part6(Redis的应用场景、Redis是单线程的速度还快、Redis线程模型:Reactor模式、事件、发布订阅、管道)~整起

    PART1-1:为什么Redis是单线程的 Redis单线程是指: Redis的网络IO和键值对读写是由一个线程来完成的.这也是 Redis 对外提供键值存储服务的主要流程.Redis的其他功能,比如 ...

最新文章

  1. server之后安装ssms失败 安装sql_SQL Server 2017 安装问题(转)
  2. 深入探究VC —— 编译器cl.exe(1)
  3. 国科大高级人工智能6-GAN
  4. Django多域名配置之Django-hosts插件的使用
  5. 大厂开发“大牛”,你距离他们有多远?
  6. 亚像素边缘提取方法总结
  7. FFA 2021 专场解读 - 实时数据湖
  8. 自定义的BaseAdapter实现LIstView的展示
  9. Mybatis中mysql blob类型乱码解决
  10. 【论文翻译 AAAI 2020 | 知识图谱综述】A Survey on Knowledge Graphs: Representation, Acquisition and Applications
  11. python爬虫实战2:爬取近100期双色球开奖记录
  12. [iOS]寻找superView
  13. Intel VT学习笔记(八)—— 开启EPT
  14. 邻接矩阵(Adjacency Matrix)
  15. 蓝桥杯试题:求数差(简单易懂无脑)java
  16. 现在计算机怎样读硬盘端口,组装电脑之硬盘识别篇
  17. [Ahoi2014Jsoi2014]骑士游戏(SPFA)
  18. map操作 java,Java中Map基本操作
  19. F4/F7飞控betaflight固件烧写,地面站 BF无法读取、不识别、未发现等飞控疑难杂症问题解决与驱动安装
  20. java eclipse sbt_SBT 构建scala eclipse开发

热门文章

  1. 五个核心能力打造普惠金融商业化发展模式
  2. 用python画爱心动图_python 动态绘制爱心的示例
  3. OpenJudge- 1789:算24
  4. 软件测试如何快速入门
  5. Rasterio入门
  6. Java教师工资习题
  7. Android应用性能剖析全攻略
  8. 【CSDN|每日一练】Longest Continuous Increasing Subsequence
  9. Python实用模块(二十四)tenacity
  10. Python学习笔记-系统性能信息模块psutil