SendGrid是一个基于云的电子邮件服务,它的后端架构从小型Postfix演变为托管在自有数据中心以及公共云上的系统。使用Go语言重写服务,逐步迁移到AWS,使用基于Ceph的分布式队列,团队因此每月可以处理超过400亿封电子邮件。

\\

SendGrid的初始架构由边缘节点组成,这些边缘节点通过HTTP和SMTP API摄取用户请求,并将它们发送到基于磁盘的队列中。这些请求在到达实际发送电子邮件的邮件传输代理(MTA)之前,会先经过一系列处理器。这种架构的潜在缺点——处理延迟以及由于节点故障导致的数据丢失——让工程团队转向使用由分布式文件系统提供支持的基于拉的模型。随着AWS基础设施的采用,他们更多地使用AWS的托管服务。InfoQ采访了SendGrid首席软件工程师Seth Ammons,了解到更多的信息。

\\

他们在演化系统方面做了很多工作,包括使用Go语言和Python重写了很多系统、迁移到AWS托管服务、使用分布式队列,并采用日志聚合和监控系统来实现可见性。分布式队列系统是一种由Ceph提供支持的定制解决方案。Ceph是一个开源的存储平台,通过复制实现内置的容错机制。Ammons表示,SendGrid目前在自有数据中心运行Ceph,他们“正处于评估这些AWS工作负载的早期阶段”,因此将在未来面临HA方面的挑战。

\\

SendGrid的监控系统由Graphite(作为指标收集引擎)和Grafana(作为查看指标的前端)组成。他们使用工具将它们推送到Kafka和Splunk来实现日志聚合。Pagerduty负责基于来自Splunk Alerts和Sensu检查的事件发送警报。Graphite存在规模问题,那么SendGrid是否面临伸缩性问题?Ammons说:

\\

\

我们遇到了一些与伸缩Graphite有关的问题。我们首先想到的是调整保留策略,并确保能够正确地聚合指标。我们采取的其他措施包括用更高性能的carbon-c-relay替换carbon_relay。度量指标通过carbon-c-relay服务器池前面的负载均衡器进入管道,这些服务器可以在后端存储出现问题的情况下将指标保存在内存中。我们还在后端存储服务器池中复制指标并对它们进行分片。

\

\\

SendGrid在测试方面面临的挑战随着架构演变而加剧。因为变更导致的生产中断可能会导致电子邮件丢失,因此团队的目标是提高单元测试和集成测试的全面性。由于电子邮件可传递性是成功的关键指标,SendGrid的系统集成测试会验证端到端的可传递性。由于存在大量的电子邮件客户端,而且每个客户端都有许多不断变化的版本,因此保持测试更新是一项巨大的挑战。Ammons阐述了他们解决这个问题的策略:

\\

\

我的团队专注于SMTP状态码,我们对错误代码和错误消息文本进行了扩展。由于这些响应会随着时间的推移而发生变化,因此我们成立了一个可交付性顾问团队,以确保我们能够以最有效的方式处理电子邮件。该团队密切监控主要收件箱的响应趋势,并维护了一个响应表,用于映射处理这些响应的规则。在处理来自收件箱的响应时,MTA代码将引用这个表。

\

\\

他们的单元集成测试使用了Docker。开发环境也使用了Docker,其中Docker的compose文件被用于管理所需的整个容器集和依赖项。然而,该团队“目前处于容器采用的过渡状态”,Ammons说:

\\

\

对于遗留应用程序,我们在开发和CI过程中使用了Docker。在大多数情况下,我们的CI系统会基于容器化的环境生成工件,这些工件可用作要部署的RPM。我们在自己的数据中心运行新服务,并开始使用Kubernetes作为容器编配器。声明式的配置更为简单,一些团队已开始利用Helm来管理在数据中心或环境之间的配置变化。我们正处于评估如何在AWS中解决这些问题的早期阶段。

\

\\

大量的应用程序指标和日志记录以及基于这两者的警报减轻了dev和prod之间的差异所带来的挑战。对于配置管理,SendGrid的遗留代码使用由Chef管理的环境变量——团队已经使用了很长时间——以及他们的配置库。代码部署通常需要经过审查、签名、合并到Github的过程,然后将二进制文件推送到他们的仓库服务器,然后再推送到生产环境。

\\

查看英文原文:How SendGrid Scales Its Email Delivery Systems

SendGrid是如何扩展它的邮件传送系统的相关推荐

  1. 《计算机网络》——文件传输协议FTP、简单邮件传送协议SMTP、邮局协议POP3、网际报文存取协议IMAP、万维网和HTTP协议、超文本传输协议HTTP

    文章目录 文件传输协议FTP FTP服务器和用户端 FTP工作原理 简单邮件传送协议SMTP 邮局协议POP3 网际报文存取协议IMAP 万维网和HTTP协议 超文本传输协议HTTP HTTP协议的特 ...

  2. 思科邮件服务器配置不正确,Cisco Packet Tracer服务器配置_邮件传送_ftp_web_email_dns_dhcp图解...

    <Cisco Packet Tracer服务器配置_邮件传送_ftp_web_email_dns_dhcp图解>由会员分享,可在线阅读,更多相关<Cisco Packet Trace ...

  3. 基于Winpcap的邮件还原系统的实现

    吴志强,马春波,敖发良 时间:2011年05月09日 来源:微型机与应用2011年第2期 摘  要: 随着互联网的普及,SMTP/POP3协议传输方式下的邮件已成为最简便.最经济的通信方式,但许多有害 ...

  4. 自己动手打造企业垃圾邮件过滤系统

    电子邮件是整个互联网业务重要的组成部分.据相关报道统计,四分之三以上的用户上网的主要目的是收发邮件,每天有十数亿封电子邮件在全球传递,其应用频率已经超过了WWW服务,因此,电子邮件已成为网络用户不可或 ...

  5. TurboMail为企业提供海量投递邮件群发系统

    2019独角兽企业重金招聘Python工程师标准>>> 一.电子邮件是海量投递用户账单的最佳途径 1.个人电子邮箱已经普及 根据2012年的统计报告,中国网民的电子邮箱使用率为44. ...

  6. 企业邮箱搭建费用,smtp邮件系统怎么搭建?验证码邮件群发,有哪些推荐邮件群发系统?

    您是否为没法发smtp群发邮件而苦恼,别担心,这里将给大家介绍一下什么是企业邮箱,邮局系统怎么搭建,验证码邮件群发,有哪些推荐邮件群发系统? 企业邮箱搭建:成本和考量因素 在如今数字化的商业环境中,企 ...

  7. 第六篇:基于朴素贝叶斯分类算法的邮件过滤系统

    前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节 ...

  8. Exchange Server 2003邮件服务器系统的基本部署思路

    <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />以下内 ...

  9. 如何设计一个能够扩展到百万用户的系统?

    作者 | Trung Anh Dang 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 设计一个能够支持数亿用户的系统并非易事,对软件架构师来说是一个很大的挑战. 以下是本文涵盖的一些主 ...

最新文章

  1. R语言ggplot2可视化自动换行适配长文本图例(legend)实战:Multiple Lines for Text per Legend Label
  2. WINCE6.0下开始菜单的“挂起(suspend)”是否可见及阻止系统进入睡眠模式
  3. 牛客小白月赛7 B 自杀游戏
  4. 剑指offer之51-55题解
  5. 如何利用【百度地图API】,制作房产酒店地图?(上)——制作自定义标注和自定义信息窗口...
  6. eclipse闪退问题
  7. php 跨域 session,php session 跨域的解决办法
  8. 将txt文件编码改为utf-8格式
  9. 创新大赛成就创业梦想 超30%入榜应用获投资意向
  10. clappr.js:Web开源媒体播放器,可扩展网页媒体播放器
  11. 数字信号处理——有限长离散变换
  12. python中keys是什么意思_python中的key是什么意思
  13. 旋风系统时间与服务器不一致,更新公告 | 8月15日早8点停服维护
  14. 网络控制播放器(局域网内通过TCP和UDP控制视频播放器)
  15. 【问答集锦】人工智能/机器学习技术在电商场景下的应用
  16. java中的set_java中的set是什么意思
  17. TTCN中PTC的运行流程
  18. win10环境下c语言打开文件失败,cfile fopen fopen_s win10下打开文件失败
  19. 【Python】图像-粘贴PNG透明图片及处理圆角
  20. Python爬虫||BeautifulSoup4库-以小猪短租为例

热门文章

  1. java jdbc封装_JDBC封装-Java(新手)
  2. 华科计算机网络报告,华科-计算机网络实验报告-Java Socket编程-网络组建实验
  3. Linux下main函数启动过程【程序员自我修养笔记】【自用】
  4. (数据科学学习手札05)Python与R数据读入存出方式的总结与比较
  5. i=i+1,i+=1与i++的区别
  6. SpringMVC中的设计模式
  7. 登陆注册重连 之 老掉牙的故事 新说法
  8. 查找某节点的所有祖先☆
  9. 诗与远方:无题(二十二)
  10. frontend-maven-plugin插件问题解决