Mi Galaxy EMQ Book

基本概念

Queue

Queue是Message的传输通道,开发者创建并使用不同的Queue来传递不同逻辑类型的Message。开发者创建的所有Queue都位于自身的名字空间下。Queue有若干属性(attribute),开发者可以通过设置这些属性来更好地适合不同的Message传输需求。开发者还可以为Queue添加用户自定义属性,保存相关信息,比如Queue的description。Queue同时也是用户授权的对象,开发者可以通过设置这些授权类型来向其他开发者共享队列中的数据。在任意时刻,开发者都可以通过SDK接口查询Queue中各种状态的Message的大致数量,了解Queue的运行状态。

Message

开发者通过Send/Receive操作来实现Queue的消息传递。每一条Message都包含String类型的Message Body,并可以设置自身的属性。如果开发者未设置Message的属性,则默认使用Queue中对应的属性。此外,Message还可以附带String或byte[]类型的用户自定义属性。

Message Id

如果Sender向Queue中send Message成功,EMQ将为每条成功的Message返回一个全局(指这个Queue)唯一的id,作为这条消息的标识。

Receipt Handle

每条成功接收的Message中,除Message Body与Message Id外,还将包含一个全局唯一的Receipt Handle。Receiver正确处理这条消息后,需使用Receipt Handle从Queue中删除这条Message。否则,这条消息将在一段时间后,重新变成可见状态,并被Receiver再次接收。如果这种情况发生,再次接收到的Message的Receipt Handle将与前一次不同。

Invisibility Time

Queue中的一条Message被Receiver接收后,将在一段时间内变为不可见,并等待Receiver的删除确认,这段时间被称为Invisibility Time。如果在这段时间EMQ一直未收到删除确认,这条消息将重新变成可读,并最终被Receiver再次接收。收到Message的Receiver如果发现在这段时间内无法完成消息的处理,可以通过SDK延长Invisibility Time;延长的时间从server收到延长要求时刻起算。如果Receiver不愿处理这条Message,可以通过SDK将Invisibility Time设为0,使Message立刻可见,并最终被再次读取。
Invisibility Time超时后,相应的receiptHandle将变为失效状态。为简化用户的程序逻辑,使用失效的receiptHandle进行删除message等操作时,EMQ将不会抛出异常,但也不保证相关操作的结果。

Delay Time

开发者有时需要使用“延迟队列”,这可以通过设置Queue或者Message的Delay Time来实现。当Delay Time大于0时,进入Queue的Message不能立即被Receiver读取。只有经过Delay Time后,Message才变得可见,并最终被读取。

Long Polling

默认状态下,EMQ收到Receive请求后,将查询分布式系统的一部分,并将查询到的这部分Message立即返回给Receiver。如果被查询的部分中暂时没有Message,将返回空。Receiver如果想减少空应答,可以通过SDK将Receive操作的Wait Time设为大于0的值,即Long Polling。这时EMQ将阻塞Receive Request,并查询整个分布式系统。当查询到Queue中的Message后,将立即返回给Receiver。如果Queue中一直没有可读的Message, EMQ将在Wait Time超时后,向用户返回空。

Batch Operation

为了减少网络交互次数,提高吞吐量,用户可以在一个Request中包含多条Message,使用Batch Operation来发送Message,删除Message或改变Message可见时间。使用Batch Operation时,EMQ将返回一个List,分别标识每条Message是否被成功处理。
默认情况下,发送Message的Batch操作具有原子性,即发送的多条Message,要么同时成功,要么同时失败。而删除Message和改变Message可见时间的Batch操作不具有原子性,可能部分成功,部分失败。

Multiple Receivers

所谓“Multiple Receivers”,即某个Queue逻辑上的多个Message Receivers。各个Receiver之间完全独立,并且都希望接收Queue中的全量Message。
Multiple Receivers的具体解释与使用请参考Tag相关操作这个章节。

Dead Letter Queue

中文名称为“死信队列”,其他队列(源队列)可以将因为某些原因而未能成功处理的消息的发送到死信队列。使用死信队列的主要好处是隔离不能成功处理的消息。另外,用户可以从死信队列中读出消息并分析其未能成功处理的原因。 死信队列的详细介绍请参考Dead Letter Queue这个章节。