目录
问题背景
公司邮件服务token有 分钟内超200封的熔断机制,当前token被熔断后,系统发邮件操作会被忽略,所以邮件服务也没有重试操作
人工发现token被熔断后,需要联系邮件群中值班人,将token恢复
分货业务依赖邮件来查看分货通知以及结果,并且分货层层依赖,如果不能及时收到邮件会影响业务的分货时效等,所以通过三个方面去解决这个问题
技术方向
系统内发邮件收口做限流
方案确认
方向:限流发邮件方法1分钟内最大200次
实现:改造系统发邮件底层方法,1分钟内最多发200个
消息队列(√)
面临问题:多出来的怎么处理?消息队列(需要持久化)
实现:新建一个topic,调用发邮件方法的请求全部扔到MQ中,自己消费,通过设置消费者的拉取间隔以及最大拉取数量限制,分钟内消费消息条数不超过200条
面临问题:多分区多消费者?
实现:默认拉取数量为32,目前MQ服务端设置,限制最大拉取数量为32
(可行)设置1个分区,一个消费者组,目前有2个实例(此时其中一个实例不会消费),设置拉取间隔为10s
(不可行,有自动加实例机制)设置2个分区,一个消费者组,目前有2个实例,设置拉取间隔为10s,最大拉取条数为16;系统在流量激增的情况下会增加实例来分摊流量
最终实现方式
topic设置1个分区,一个消费者组,使用默认负载均衡策略:平均分配
//平均分配负载均衡核心逻辑
int index = cidAll.indexOf(curre