Mi Galaxy EMQ Book

1. EMQ最常见的使用流程是怎样的?
首先,用户需要创建Queue。创建Queue时,用户可以指定Queue的参数。一般情况下,用户直接使用默认参数即可。 之后,用户就可以使用这个Queue进行Message的收发。 用户收到Message并成功处理后,调用deleteMessage()删除这条Message,以避免重复接收。 Queue不再使用时,应及时删除,释放资源,避免Quota用尽。

2. 为什么createQueue()返回的response中的queueName与request不一样?我调用其它API时应使用哪一个?
为了避免不同的用户创建同名Queue导致冲突,我们将Queue放置在各用户自已的名字空间下。在目前的实现中,采用“用户id前缀”来做区分。 用户之后所有的操作,包括Message收发、Queue更新等,都应使用response返回的queueName。

3. purgeQueue()操作的含义是什么?为什么这个API调用耗时这么长?
这个操作将清除Queue中的全部Message,包括delayed message、invisible message。 purgeQueue()操作在效果上相当于删除Queue之后再创建,同时保持Queue的属性及Queue关联的Tag不变。因此,这个调用消耗资源较多,一般需要10秒左右的时间来完成。

4. 被删除的Queue还可以恢复吗?
在目前的实现中,删除Queue的同时,会将Queue中的全部Message从物理上删除,因此不可恢复。

5. Message可以附带数据吗?比如一幅图片?
可以。 用户在sendMessage()时可以附加若干条属性。属性既可以是String类型,也可以是byte[]类型。 对于较小的图片或二进制文件,可以直接把它作为byte[]类型的属性附加在Message中。如果文件较大,可以先把文件存储在对象存储系统中(比如FDS),再将文件的地址作为String类型的属性。

6. EMQ的batch操作具有原子性吗?一次batch操作可以处理多少条Message?
sendMessageBatch()有原子性;其它batch操作不具有原子性。 一次batch操作的Message条数,建议限制在100条以下。 另外,一次sendMessageBatch()操作发送的Message的总大小(Message附加的attribute包括在内),不应超过Queue创建时所设置的上限(上限最大为256 KB)。

7. changeMessageVisibilitySeconds()这个API一般在什么场景下使用? 有当Receiver发现自己无法处理收到的Message,或者预估处理此条Message所需时间大于invisibilitySeconds时,才需要使用这个API改变Message的可见性超时。

8. 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的接收。

9. 为什么消息重复了?
忘记Ack(如处理异常时),或极少数情况下(比如服务器重启)服务导致的Ack失效.

10. org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool异常的原因?
SDK中HttpClient连接池设置的大小不够.

11. 是否EMQ故障导致了我的系统延迟增大?是否是EMQ的原因导致的队列消息堆积?
先查监控(qps,latency,条数/s).

12. 怎样跨域使用?
专线或为SDK httpClient设置代理.

13. 怎样扩展队列?
联系管理员增加队列分片个数.

14. 默认Tag不能删除?
是.