2020-08-06:现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来 负责具体的邮件发送任务,如何让系统尽快地完成发送? 请详述技术方案!

福哥答案2020-08-06:

参考答案:
A.借助消息中间件,通过发布者订阅者模式来进行任务分配
B.master-slave 部署,由master 来分配任务
C.不借助任何中间件,且所有节点均等。通过数据库的 update returning,从而实现节点之间任务的互斥

[知乎答案:](https://www.zhihu.com/question/412344966)
这个问题解决方案很多,主要要考虑:
1.动态任务分配:例如如果是先分配好,后执行的话,那么在执行发邮件的时候,加入节点,没法分摊压力
2.任务补偿:如果某个节点挂了,分配给这个节点的任务,需要其他节点执行。

如果可以使用中间件的话,那么各种MQ的集群消费模式,是比较好的方案。这个集群中节点可以动态添加,删除,每个消息只在某个节点消费一次。只有发邮件成功,消费才算完成,这样补偿也有了。
不能使用中间件,可以采用分配者,执行者模式,或者master-slave模式,动态根据当前集群节点数分配任务执行。如何分配,可以:
1.任务id哈希对于节点个数取模
2.一致性哈希分配

如何执行:
1.同步调用,调用slave或者执行者接口,发送成功返回。吞吐量比较差,任务堆积在分配者或者master这里,耗费资源多。
2.异步调用,调用slave分配任务立刻返回,slave真正发送前,加分布式锁,查询数据库这个任务是否发送完成,如果没发送则发送后更新数据库。假设发邮件接口最大响应时间是10s,那么master可以考虑一个任务经过30s(大于十秒,不要过于接近)以上时间,就可以补偿这个任务重新分配。
***

[评论](https://user.qzone.qq.com/3182319461/blog/1596668807)

posted @   福大大架构师每日一题  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示