当前位置: 首页 > news >正文

消息队列系列二(IOT中消息队列的应用)

许多消息队列旨在为您的应用程序提供轻量级的发布/订阅消息传输协议。为什么以及何时在您的物联网项目中使用消息队列?

考虑温室中的温度传感器,它测量温度。您的应用程序可以在15分钟的时间间隔内(每天月96次)将温度发送到消息队列。而不是处理温室中的数据并始终连接。

物联网的消息队列旨在提供轻量级的发布/订阅消息传输。您只需发送数据并在另一项服务中处理数据,而不是保留处理温室数据的应用程序。这需要较少的网络带宽,这可能会限制您的传感器,或者您的传感器通过卫星链路进行通信。

消息队列使您的应用程序具有低功耗,发送最小化的数据包,并有效地将信息分发给一个或多个接收器。

物联网项目中的消息队列

消息队列是一种服务到服务通信的方式。它允许应用程序通过相互发送消息进行通信。消息队列的基本体系结构很简单,有些客户端应用程序可以创建消息并将它们传递到消息队列。其他应用程序/服务从队列中检索消息并处理消息中包含的请求和信息

消息可以包含任何类型的信息。例如,它可以获得有关应该从另一个应用程序(可能位于其他位置)开始的进程/任务的消息,或者它可能只是需要处理的数据。

物联网和异步消息

因特网 应用程序被动反应和异步是一个“必须”。大多数IoT应用程序应该能够处理来自设备的许多连接以及从中过去的所有消息

异步消息传递在机器到机器通信中被广泛使用。这以为这发送方不会期望立即相应,并且发送方在等待相应是时不会“阻止”任何内容。

异步通信可以实现灵活性,应用程序可以发送消息,然后继续处理其他事情-在同步通信中,它必须等待实时响应。您可以将消息写入队列,然后让相同的业务员逻辑发生,而不是调用Web服务并等待它完成。

在您的应用程序需要完成某些操作但不需要立即完成,或者甚至不关心结果的情况下,队列可能很棒。

解耦

消息队列可用于实现解耦,并有助于保持结构的灵活性。它使得用不同语言编写的两个不同的应用程序连接在一起非常容易。

消息队列允许每个组件独立地执行其任务-它允许组件保持完全自治并且彼此不知道,一项服务的更改不应要求更改其他服务。它是分离服务的过程因此它们的功能更加独立。

冗余和弹性

应用程序有时会崩溃 - 它会发生。这可能是由于超时或您的代码中只有错误影响整个应用程序。消息队列强制可以使接收应用程序确认它已完成任务,并且可以安全地从队列中删除该任务。如果接收应用程序中的任何内容失败,该消息将保留在队列中。

当目标程序繁忙或未连接时,消息队列提供临时消息存储。

通过打破您的应用程序并按队列分隔不同的组件,您固有地创建了更多的弹性。即使部分后端处理延迟,您的应用程序仍然可以运行。

交通高峰

许多应用程序的流量激增。门铃应用程序,让您可以从任何地方回答您的门,万圣节期间可能会有交通高峰,而购物应用程序可能会在黑色星期五有交通高峰。通过对数据进行排队,您可以确保最终保留和处理您的数据; 即使这意味着由于高流量峰值,它需要比平常更长的时间。

使用RabbitMQ对IoT进行消息队列排队

有一些IoT通信协议和标准旨在简化物联网设计。如果您考虑基于队列的解决方案,CloudAMQP会提供两种最流行的开放式消息传递协议;AMQP和MQTT通过RabbitMQ。

AMQP是一种安全可靠的协议,开销低,非常适合物联网应用,AMQP是一种比MQTT更先进的协议,更可靠,更好的支持安全性。AMQP还具有灵活路由,持久和持久队列,群集,联合和高可用性队列等功能。缺点是它是一个更冗长的协议-取决于您如何实施您的解决方案。

MQTT是为物联网设计的另一种协议。MQTT宣传的物联网优势仅适用于功耗极地的设备。MQTT非常节能 ,它非常注重最小的线路占用空间。由于其简单性,在客户端上实现MQTT所需的工作量比AMQP要少。但是MQTT缺少从服务器到客户端的授权和错误通知,这是一个很大的限制。

RabbitMQ是一个消息队列软件,称为消息代理或队列管理器,简单地说,它是一个可以定义队列的软件,应用程序可以连接到队列并将消息传输到队列上。

相关文章:

  • js排序篇----快速排序,选择排序,冒泡排序,希尔排序
  • Service Worker
  • 《文献管理与信息分析》第五章 学习笔记
  • 一些集群操作以及问题查询
  • GraphQL学习过程应该是这样的
  • Spark -- WordCount程序
  • Java SE 12扩展Switch语句/表达式完整指南
  • java中具有继承关系的类及其对象初始化顺序
  • 和平之翼代码生成器SMEU版 4.0.0 Beta5 宝船公布
  • 去哪里学习行业知识?
  • java概述
  • Kubeadm证书过期问题修复方法之一:通过修改kubeadm源码
  • 区块链分支循环
  • java中【派生类、基类、父类、子类】
  • FydeOS VM for VMWare v6.0 Preview1 发布
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Bytom交易说明(账户管理模式)
  • es6(二):字符串的扩展
  • Invalidate和postInvalidate的区别
  • JAVA SE 6 GC调优笔记
  • javascript从右向左截取指定位数字符的3种方法
  • JS字符串转数字方法总结
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python中eval与exec的使用及区别
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • rc-form之最单纯情况
  • React系列之 Redux 架构模式
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring声明式事务管理之一:五大属性分析
  • tensorflow学习笔记3——MNIST应用篇
  • windows-nginx-https-本地配置
  • 搞机器学习要哪些技能
  • 前嗅ForeSpider教程:创建模板
  • 事件委托的小应用
  • 一个JAVA程序员成长之路分享
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 移动端解决方案学习记录
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (function(){})()的分步解析
  • (备忘)Java Map 遍历
  • (二)hibernate配置管理
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (四)js前端开发中设计模式之工厂方法模式
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (循环依赖问题)学习spring的第九天
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)大道至简,职场上做人做事做管理
  • (转)四层和七层负载均衡的区别
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *p++,*(p++),*++p,(*p)++区别?