# 消息组播

## Coolpy7支持组播模式

### 组播模式通用说明

消息从一个或多个生产者产生，生产者与消费者通过相同的主题（Topic）做到关连，消息只会给多个消费者中某一个消费即表示消息已消费成功。

![组播说明](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPz4APWKTuf0FRQG1lh%2F-Lb19Fi4ScsHFZ1pOLS3%2F-Lb1D6OWGIaWjXVxhXBb%2Faaa.jpg?alt=media\&token=31cb19be-0006-41fb-8bc1-3f8ddbcecf5f)

### Share模式 (Topic以 $share/开头）

share模式应用于消息允许丢失但要求性能极高的场境，当多个消息推送到Coolpy7后内核会提取所有当前已经订阅客户端进行轮播，当某个消息被成功推送一次即返回（视为消费成功），不再推送给其他订阅者

如果主题没有任何订阅者即视为消息放弃推送，因此需注意必须最少有一个订阅者消息才会被正常推送，否则消息即视为放弃推送

另一种情况会丢失消息，当消息生产者产生的速度远远大于所有消息消费者总和时，消息将不被保证会推送成功，即需要足够多的消息消费者才能被保证消息生产者的性能指标，性能指标公式：O(n+1)， n为已经在工作中的消费者个数

#### 特性：

1. 消息可能丢失
2. 保证消息有序性
3. 保证消息不重复
4. Topic禁止使用通配符
5. Topic以($share/)开头

![share模式](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPz4APWKTuf0FRQG1lh%2F-Lb1KyXARA7XpOYskb-O%2F-Lb1LCONUmJiAE27PQo3%2Faaa.jpg?alt=media\&token=f5978001-cd0f-4e4a-b181-5c76e9c74f30)

### Queue模式 (Topic以 $queue/开头）

queue模式应用于消息绝不丢失的场境，消息由生产者到达Coolpy7后会直接入到消息队列，然后再由一个以20ms的批次中断器触发消息队列批量推送，当消息批量推送时某一个推送操作失败时跳出当前工作协程，等待下一轮调度器触发后再复重相同操作，直到消息队列中所有消息被推送完毕。

消息队列会为Topic为分组进行不同组别的消息列队分组，做到不影响其他Topic组播。每次queue组播会一次性尝试推送完当前组别所有消息队列中所有消息。

所以调度器只作为一次消息检查的触发和协程管理功能，消息推送是以每个时间周期一次性推送完所有缓存消息。

{% hint style="info" %}
消息队列功能使用Leveldb技术支持单库10亿级数据o(1)操作
{% endhint %}

#### 特性

1. 保证消息不丢失
2. 保证消息有序性
3. 保证消息不重复
4. Topic禁止使用通配符
5. Topic以($queue/)开头
6. Qos必须为0

![queue模式](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPz4APWKTuf0FRQG1lh%2F-Lb1Lq27TRfSY3XkX543%2F-Lb1P_XLJFt_CztxQtLx%2Faaa.jpg?alt=media\&token=32e83afb-77f4-446f-9b8c-043d1f13ed77)

### 结论

两种组播模式支持各自不同的应用场境 ，share模式应用于对消息不需要很高可靠到达，但消息会以高实时性组播推送的情况，而queue模式即应用于消息100%不允许丢失而实时性要求可以允许有所损失的情况。而两种模式都共同具有消息只需要被组播中某一个消费者消费完即视为消息消费完成，不会再推送给其他任何消息者。
