0%

阿里云推送消息体过长问题记录和处理

问题描述

在测试推送时,发现控制台报了如下错误

1687748590734c7a382374ee125ff542c0152ce1040ff.png

定位到问题是推送传输的内容过长导致的

1687748602717ec171c1c0127a24e4008419b342111df.png

168774861071412f1913156f334cf2d017399fdce22a8.png

在阿里云文档中找到相关的描述

1687748615714803fcde9bb30ee6664c20e6b9427976c.png

解决办法

出现该错误的原因是服务端在推送时进行了优化处理,相同类型的数据由轮询推送改为直接推送一条 List,导致提交的实体长度过长。目前这样处理的推送有许多:

168774862371708eddf95104db54b52149adbd68ba995.png

16877486437162f8f14a1c3be6b9a3455141ca4a6634c.png

目前的解决办法就是将实体拆分成多个子数据块分别传输,代码如下:

16877486527158b7f26af92598e0e69f735188771876b.png

1687748659713d910dcf8afa62343544b651bc55f2a5a.png

List类型的数据进行拆分后不会影响数据的完整性,其他类型的数据拆分后数据完整性会受到影响。因此目前仅处理了 List 类型的数据,其他类型的数据如果长度过长仍然会报该错误。目前想到的解决办法有两个:

  1. 类似 netty 的拆包粘包操作。正常拆分,拆分后的子数据块增加标识,App 在接收到有相应标识的数据时,需要进行相应的处理。
  2. 若数据过长,则不执行推送。而是推送一条特殊数据给 App 端,App 端在接收到该数据后,主动请求服务器执行拉取操作。

阿里云推送的其他限制

详细见链接:移动推送使用限制

168774866971667de408699e82881284386444bd6883c.png