# 车联网消息上下行保序
华为云IoTDA服务在满足高可靠、高并发的同时可按需开启设备维度的消息上下行保序功能。本文以MQTT协议为例介绍基于IoTDA的上、下行消息的保序方案。
#### 场景说明
典型如车联网场景中：高速行驶中的车辆会实时上报自身的GPS位置数据（通常1\~5秒/条数据），IoT平台接收该数据并转发给云端应用，应用侧根据上报的位置数据绘制实时轨迹地图，车辆端上报的轨迹点依次为：A点------\>B点------\>C点，在乱序情况下，应用侧接收到的轨迹点可能会为：B点------\>A点------\>C点，从而导致绘制的轨迹地图与真实轨迹不符。
#### 上行消息保序
在需要上行消息保序的场景，可以参考如下图的方案进行设计：
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001308214689.png "点击放大")
- 设备-平台：设备侧上报消息时，Qos值设置为1，上报消息A后，等收到消息A的Qos响应后，再依次上报消息B和消息C，从而保证设备与平台侧的消息上行保序。
  
- 平台-应用：IoTDA配置数据流转规则为流转到Kafka，当开启IoTDA的消息保序功能后，IoTDA会将同一个设备的消息推送到Kafka的同一个partition，从而实现平台与应用端的转发保序。
  
- 应用服务器消费Kafka数据时，同一个设备的消息会分发到同一个消费者，消费者可以按顺序消费设备依次上传上来的数据。
  
#### 下行消息保序
在需要下行消息保序的场景，可以参考如下图的方案进行设计：
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001260781604.png)
- 应用平台调用[同步命令](https://support.huaweicloud.com/api-iothub/iot_06_v5_0038.html)接口下发命令A。
  
- IoTDA收到同步命令A的请求后，会将命令转换为MQTT消息下发给设备，下发请求后平台会阻塞等待，等待设备返回命令A的执行结果。
  
- 设备收到命令A的请求，执行完对应操作后，返回命令A的响应。
  
- IoTDA收到命令A的响应后返回命令结果给应用侧。
- 应用平台收到命令A的响应后再下发命令B。
![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
通过物联网平台实现消息保序会对整体性能略有影响， IoTDA默认关闭该功能，如有需求请[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)咨询，当前仅企业版支持开启该功能。
