消息系统扩容处理

(1)消息中间件自身如何扩容

消息中间件本身没有持久状态,扩容相对容易,主要是让消息的发送者和消息的订阅者能够感知有新的消息中间件加入发哦了集群,这是通过软负载中心完成的,


这里要解决的是,同一个存储张如何区分存储的消息是来自哪个消息中间件应用的,解决方案是给每条消息增加一个server标识的字段,当有新加入的消息中间件时,会使用新的server标识,这一方案要应对的问题是,当有消息中间件应用长期不可用的话,我们就需要加入一个和它具有同样server标识的机器来替代它,或者把通过这个消息中间将进入到消息系统中但还没有完成投递的消息分给其他机器处理,也就是让另一台机器承担剩余消息的投递工作。

(2)投递处理的优化

第一个是在进行投递时一定要采用多线程的方式处理,单线程处理时要等待处理结束再进行下一条消息的处理,每个线程处理一条消息时,会得到需要接收该消息的订阅者集群id列表,然后从每个订阅者集群id选择一个连接来处理,消息投递后需要等待结果,然后统一更新消息表中的消息状态,这种方式正常情况没有问题,但如果订阅者集群张有一个很慢的订阅者,负责投递的所有线程会慢慢被堵死,因此都需要等待这个慢的订阅者的返回。

可以采用另一个方式,把处理消息结果返回的处理工作放到另外的线程池中来完成,也就是投递线程完成消息到网络的投递后就可以接着处理下一个消息,保证投递的环节不会被堵死,而等待返回结果的消息会先放在内存中,不占用线程资源,等有了最后的结果时,再放入另外的线程池中处理,这种方式把占用线程池的等待方式变成了靠网络受到消息处理结果后的主动响应方式。

第二个可优化之处:一个应用上有多个订阅者订阅同样的消息,如果不加以优化,会向这个机器发送多次同样的消息。


优化:单机多订阅者共享连接

消息只发送一次,然后传到单机的多订阅者生成多个实例处理


(3)订阅者视角消息重复的产生和应对

1、消息重复的产生原因

消息发送端产生消息重复的原因是消息成功进入消息存储后,有因为各种原因使得消息发送端没有收到“成功”的返回结果,并且又有重试机制,因而导致重复,一个解决办法是,重试发送消息时使用同样的消息id,而不要消息中间件端产生消息id。

第二个原因是消息到达了消息存储,由消息中间件向外进行投递时产生重复。

在投递过程中产生的消息重复接收的主要原因是因为消息接收者成功处理完消息后,消息中间件不能及时更新投递状态造成的。那怎么解决呢,可以要求消息接收者来处理这种重复的情况,也就是要求消息接收者的消息处理时幂等操作。

幂等是一个数学概念:(1)在某二元运算下,幂等元素是指被自己重复运算的结果等于它自身的元素

(2)某一元运算为幂等时,其两次作用在任一元素后会和其作用一次的结果相同。

例如update table set count= 10 where id= 1;这个操作多次执行,id等于1的记录中的count字段的值都是10,这个操作就是幂等的,不用担心这个操作被重复。

update table set count = count + 1 where id=1这个不是幂等的,一旦重复,结果就会发生变化。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值