摩羯座de杰杰陆 2022-10-27 22:29 采纳率: 100%
浏览 93
已结题

求物联网,按机器实现命令队列模式下发技术方案

问题背景

物联网场景下,平台给设备下发命令。同时给一个设备下发命令时会导致命令一个成功一个失败。

需求

1、按设备实现命令的对列发送,一个发送成功在发送下一个
2、命令有优先级,优先级高的命令可以实现插队
3、命令发送后8秒如果未收到回复认为发送失败

  • 写回答

4条回答 默认 最新

  • 冒菜-码农 2022-10-31 14:07
    关注

    解决方案:
    方案一:
    使用Redis + MQ + 任务调度;业务伪逻辑:
    1、封装统一发送命令的接口,入参为命令抽象对象集合、设备ID。命令抽象对象集合有优先级字段
    2、对命令集合进行排序
    3、设备ID最为redis的Key,判断redis中是否已存在,如果不存在,则直接推送MQ,注意MQ使用事务消息,这样可以避免8秒等待
    4、如果redis中有该设备ID,去除value,value为已发送成功的命令,循环判断当前命令是否已存在,若已存在则跳过,否则继续发送MQ,并将成功的发送的MQ添加到该value集合里
    5、推送MQ失败的命令单独封装为一个有设备ID和命令的对象,并存储到redis或持久化到DB中,使用任务调度补偿重试

    方案二:
    线程池 + 线程安全队列
    1、使用线程池管理要推送的命令集合,每一个线程对应一个设备ID
    2、要推送的命令集合进行去重和排序
    3、使用有界队列避免内存损耗,自定义拒绝策略,避免命令丢失
    4、要推送的命令集合注意使用线程安全的队列
    5、任何线程都等待8秒响应,不要释放资源,如果发送失败,则存放到失败的共享数据源里
    6、单独起一个线程,比如守护线程,对发送失败的数据进行重试机制

    这是我目前能想到的,推荐方案一,方案二存在集群环境的风险。 如果不明白可以私信讨论

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 修改了问题 10月27日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 时间序列预测算法 预测结果出现负值
  • ¥15 苹果mac m1系统在关闭sip后怎么能使用app
  • ¥15 在win系统Django虚拟环境下载mysqlclient报错
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计