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