欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

IOT项目中Redis与kafka做消息队列比较:Redis逐渐淘汰

程序员文章站 2022-08-29 20:38:49
鉴于本人在IOT项目中使用消息队列缓存设备端的大量数据,需要分析瞬间消息数据缓冲,小型项目可以使用redis,而大型项目不行,为了后续扩展项目,建议采用kafka而非redis,项目中有一种情况下平台端更新维护后,设备端数据缓存过大存储到redis瞬间压力过大导致redis内存击穿报错,此情况已经多次出现,分析后得出是随着项目扩展,设备端接入不断增加导致redis负荷过载先写Redis,再异步同步到mongodb里面,Redis除了做消息队列同时,平台端访问的实时数据也在Redis,访问历史数据在mon...

鉴于本人在IOT项目中使用消息队列缓存设备端的大量数据,需要分析瞬间消息数据缓冲,小型项目可以使用redis,而大型项目不行,为了后续扩展项目,建议采用kafka而非redis,项目中有一种情况下平台端更新维护后,设备端数据缓存过大存储到redis瞬间压力过大导致redis内存击穿报错,此情况已经多次出现,分析后得出是随着项目扩展,设备端接入不断增加导致redis负荷过载

import redis

# 连接数据库
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=10, decode_responses=False)

# 如果要添加连接池则先创建连接池
# pool = redis.ConnectionPool(decode_response=True)
# db = redis.Redis(connection_pool=pool, host='127.0.0.1', port=6379)
# 又一种连接数据库的方式,方法和redis-cli 的使用命令基本一致
db = redis.StrictRedis(connection_pool=pool)

# 数据操作
db.set("name", "disen", ex=100)  # 添加string类型的key-value
print(db.get("name"))  # 速去string类型的key
db.lpush("names", "disen", "jack", "mack")
# db.lrange("name", 0, -1)
db.save()
if __name__ == '__main__':

    if not begin_sync:#此处不执行,,,,
        ConnectMongoDB.last_sync_time = time.time()
    #只连接redis
    pool = redis.ConnectionPool(host=REDISHOST, port=7379, db=10, password='root1234567')
    r = redis.StrictRedis(connection_pool=pool)

    client_loop()#循环连接到mqttserver,并订阅消息存储到Redis
def client_loop():
    client_id = time.strftime('ToMongo_%Y%m%d%H%M%S', time.localtime(time.time()))
    client = mqtt.Client(client_id)  # ClientId不能重复,所以使用当前时间
    client.username_pw_set("admin", "Sun55kong@A")  # 必须设置,否则会返回「Connected with result code 4」
    client.on_connect = on_connect  # 从MQTTserver订阅消息,不加括号调用的是函数体非函数实例。
    client.on_message = on_message  # 保存数据到redis。
    msg = json.dumps(msg_dict)      # 保存数据到kafka
    producer.send('mykafka', bytes(msg, encoding='utf-8'), partition=0)
    producer.close()
    client.connect(HOST, PORT, 60)
    client.loop_forever()

 

 

先写Redis,再异步同步到mongodb里面,Redis除了做消息队列同时,平台端访问的实时数据也在Redis,访问历史数据在mongodb,此处相当于业务上过度复用一个 redis,既用它做缓存、做计算,还拿它做任务队列,这样不好,实时展示数据与消息队列共用,导致在查询实时数据时刚好在数据失效的同一节点导致查询穿透或者等待二次查询等临时性方案。

 

redis做消息队列,一旦有业务爆发,内存不够直接挂掉,所以为了后续项目的稳定还是采用kafka+zookeeper

 

首先都可以做队列,且可以支持多个队列。redis是多个key,kafka是建多个topic。
    都有持久化,部署都很简单。
    redis使用起来简单,编码也简单;kafka略复杂,但也不是很复杂。
    kafka可以集群,redis也可以集群。
    kafka的一个队列可以有多个分片/子队列,redis不能。redis可以通过客户端负载到多个集群,进而变相实现单队列拆分成多个小队列。kafka是专业的MQ组件,redis不是。
    两者都没有消息消费确认机制,貌似只有rabbitmq有?且rabbitmq独有RPC功能?

消息量不大,可以使用redis做mq,如果量特别大,还是kafka合适,否则redis有可能扛不住被击穿。另外kafka好像比较适合大吞吐量的消息,例如系统日志,kafka+elk是经典的日志收集系统。

 

Redis还是最适合做缓存,而非消息队列。

本文地址:https://blog.csdn.net/weixin_42544051/article/details/107207387