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

这篇博客对比了Redis和Emitter在处理金融实时行情数据,如orderbook和ticker等场景下的性能。测试结果显示,Redis在实时数据处理上表现出更高的稳定性和更低的延迟,适合对实时性要求极高的应用。Emitter虽然方便快速部署,但在测试中延迟逐渐增大,稳定性不如Redis。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求: 金融项目,需要实时行情数据,例如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 json

from emitter import Client


conn = 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 time

from emitter import Client


def 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 time

import redis


rds = redis.StrictRedis()


a = 1
while True:
    data = {
        'no': a,
        'ts': time.time()*1000
    }
    rds.publish("test1", json.dumps(data))
    a += 1
# sub.py
import json

import redis
import time

rds = 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稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值