1.5.2 Message
1. Message可以附带数据吗?比如一幅图片?
可以。 用户在sendMessage()
时可以附加若干条属性。属性既可以是String类型,也可以是byte[]类型。 对于较小的图片或二进制文件,可以直接把它作为byte[]类型的属性附加在Message中。如果文件较大,可以先把文件存储在对象存储系统中(比如FDS),再将文件的地址作为String类型的属性。
2. EMQ的batch操作具有原子性吗?一次batch操作可以处理多少条Message?
sendMessageBatch()
有原子性;其它batch操作不具有原子性。 一次batch操作的Message条数,建议限制在100条以下。 另外,一次sendMessageBatch()
操作发送的Message的总大小(Message附加的attribute包括在内),不应超过Queue创建时所设置的上限(上限最大为256 KB)。
3. changeMessageVisibilitySeconds()
这个API一般在什么场景下使用?
有当Receiver发现自己无法处理收到的Message,或者预估处理此条Message所需时间大于invisibilitySeconds时,才需要使用这个API改变Message的可见性超时。
4. createTag()
与receiveMessage()
都可以按消息的属性进行过滤。它们在使用场景上有什么区别?
Tag(包括Queue对应的default Tag)在逻辑上可以视为一条Message管道。 createTag()
参数中的filter限制了进入管道的Message的类型;而设置了filter的receiveMessage()
仅是把其需要的Message从管道中取走。如果管道中的某些Message一直没有被取走,那么将最终影响其它Message的收取。 具体而言,如果Message分为A/B两种,需要分别被两类Receiver接收。那么可以创建一个不带filter的Tag,并且在receiveMessage()
时指定接收消息的属性。 如果仅需要接收A,不需要B,那么就应该在创建Tag时指定filter。否则,进入Tag的B类Message最终将影响Receiver对A的接收。
5. 为什么消息重复了?
忘记Ack(如处理异常时),或极少数情况下(比如服务器重启)服务导致的Ack失效。如果难以排查可以联系EMQ支持人员帮忙排查。
6. emq中显示有消息,但查询不出来
1.检查EMQ控制台 可读消息 一栏是否为0,只有这一栏不为0才有消息可以接收。2.如果设置的是短轮询,是有一定概率拿不到数据的,可以更换为长轮询再尝试一下。3.如果设置的是长轮询,检查一下长轮询过期时间是否设置的太短,设置太短可能会造成还未遍历到有数据的机器就超时返回了。