科技微讯

腾讯云 CMQ 消息队列使用笔记

cmq 有两种模式:

订阅模式

把消息 publish 到主题后,这个主题会主动把消息推送(push)给订阅者,订阅者可以是队列,也可以是 http endpoint。

我尝试了 http endpoint,这个 endpoint 是一个 tcb 云函数,每次发送消息给主题后,这个云函数都会被触发,函数将接收到消息内容和消息属性。

订阅模式不能设置延迟,所以你发送了多少消息到主题,主题都会一股脑儿不分先后地调用这个云函数,如果消息数量很多,可能会超过云函数的并发限制。

消息主题如何判断自己的消息是否成功投递?它是根据订阅方返回的内容进行判断的:云函数返回 2xx 状态码,则认为投递成功。

投递失败后的处理:如果返回非 2xx 的状态码,又或者根本没返回(例如函数出错),则被认为投递失败,失败后会自动重试,重试一定次数后停止重试,并在生命周期结束后自动丢弃。

在主题中,需要关注消息堆积数量,堆积有 3 种情况:

所以对于订阅模式,消费者无法控制消息的丢弃,如果订阅者出错,有可能会导致消息永远发不出去,并且用户可能无法知道这些发不出去的消息是什么。

队列模式

队列的工作模式:

假设队列中突然出现 1000 条消息,我怎么拉起一个高并发的函数去快速地处理它们呢?有批量消费信息的 api,但最多只能同时消费 16 条消息,假设消费一批消息用 1s,那消费完这 1000 条消息岂不是用 1000/16 秒?解决方法:用腾讯云 api 的 cmq 管理端 api 查询各队列的消息数量,根据数量唤醒 n 个云函数取处理消息。

在订阅模式中,主题会主动拉起多个并发实例,直接拉起几百个实例几秒钟就能处理完 1000 条消息。亚马逊的 sqs 的 pull 模式支持绑定云函数,云函数不需要主动 pull,sqs 的队列中的消息会作为事件主动触发云函数,看起来好像是订阅模式,但它支持队列该有的功能(例如删除被视为成功消费,支持死信队列等),但 tdmq 的 cmq 不支持这个功能。

暂无评论