构建高效的EDM平台经验

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: EDM 是 EmailDirect Marketing 的缩写,即邮件营销。是利用电子邮件(Email)与受众客户进行商业交流的一种直销方式,邮件营销对于企业的价值主要体现在三个方面:开拓新客户、维护老客户,以及品牌建设。那么如何才能构建高效的EDM平台经验呢?本文不容错过。

本文是来自中生代技术交流群的分享,本文中京东高级研发工程师刘锟洋将与大家分享构建高效的EDM平台的经验。


1.EDM

EDM 是 EmailDirect Marketing 的缩写,即邮件营销。是利用电子邮件(Email)与受众客户进行商业交流的一种直销方式,邮件营销对于企业的价值主要体现在三个方面:开拓新客户、维护老客户,以及品牌建设。

在互联网领域,大部分企业都有类似业务,国内的比如:京东,当当。国外有Uber,苹果,亚马逊。总体来说,有欧美背景的公司往往比较重视EDM,所以EDM的效果也做得很不错,而国内就相对做的少一点。

京东的EDM应该是其中规模相对大一点的,每日发送量在千万级别,峰值数据2T(每日),如何能在峰值到来时保证系统的稳定,以及从大量的邮件发送任务中筛选出高优先级发送任务并及时发送是构建这个平台的难点。

2.老平台的痛点

在老平台中一封邮件的发送过程大致是这样的:

可以抽象成标准的生产者消费者模型。

数据库作为“生产线”衔接生产平台和发送平台。

这是个过于依赖数据库的设计,生产平台负责插入数据,发送平台负责扫描和处理数据。同一时间内,多个发送平台同时扫表,扫表到数据后更新,更新成功的平台负责执行发送任务。

这个糟糕的设计导致了每次数据库更新操作都只有依靠发送平台数量的成功率,竞争非常激烈。

因为当时对邮件发送服务的经验不足,系统是属于摸着石头过河的方式“长大”的,这直接导致了系统在设计之初缺乏合理的规划和预期,属于无序生长状态,大致表现在:

  1. 类似业务,有完全不同的实现方案。
  2. 应用职责划分不清晰,产生很多鸡肋应用,下线不行,上线难维护。
  3. 应用内部结构紊乱,人为的逻辑复杂。
  4. 实现方案严重依赖数据库,对数据库压力非常大。

当业务需要做出较大变更时,整个EDM平台变成了一块难啃的骨头。

3.新平台的目标

在架构升级改造之初,我们定下了几个目标:

  1. 设计容量至少按现在峰值的三倍设计,针对峰值流量要做到自适应,大促不降级。
  2. 重新梳理应用,必须做到清晰的应用职责划分,不做鸡肋应用。
  3. 应用必须实现任意机房5分钟部署,便于服务的快速搭建和恢复。 

4.新平台的解决方案

第一步是解决“热点”问题。我们做了如下优化:

  1. 物理上,数据库分表,将大表数据隔离。
  2. 按优先级,目标邮箱等条件生成多个Redis FIFO队列,将发送任务预先分流,发送平台到相应队列中获取发送任务并发送。
  3. 集中管理功能,生成新的管理平台,并通过自研的服务监控与配置推送框架时时监控服务,必要时管理员可以在后台通过配置推送干预整个大平台的运行情况。

第二步,提高可用性。我们做了如下优化:

  1. Redis做了一主两从的设计,两个从分布在不同的机房。
  2. 发送平台在多机房部署,保证任何一个机房都可以提供发送服务。
  3. 在MQ消费端,Redis生产端,Redis消费端分别做了阀值控制,从下游到上游,可以依次控制流量在系统内部的流转情况。
  4. 增加Checker,保证邮件发送任务的及时执行。

5.结果

1. 发送效率提升300%(体现在邮件的任务的入库量上)。
2. 在3倍峰值流量下,数据库QPS只有原有数据的1/5,CPU10%以下,load5以下。


6.延展问题

1. 现在的每个元素大约在5K-8K, Redis队列在元素大小大于10K时,性能会急剧下降,如果发送量再大一点,还有哪些办法可以提高Redis的传输效率?
2. 对邮件任务按邮箱分表后,如果是要查询同一个用户的邮箱(用户邮箱一段时间后可能会变),怎么办,有哪几种办法?


Q&A

Q:不明白,分库分表有啥影响?
A:原来所有数据都放在一张表的话,那只要你对这张表进行操作的话,你的页锁,你的表锁都会影响并发的性能。分表后,好处就是并发性更高,坏处就是,如果你用某一个维度进行分表的时候,一旦你用另外一个维度进行查询的时候,就会出现跨表的操作,在某些时候,事务就无法使用了。

Q:分库分表按什么维度来分?
A:当时也考量过几种方案,包括按时间去分,但按时间去分通常有个问题就是,总有一张表是很热的。特别是对这种发送任务,因为我们只需要把任务拿到一个库,发送完毕,更新完毕,这个任务就可以不要了。所以不太适合用按时间分表的方案。

Q:为什么不直接把邮件发送到队列,邮件发送服务再从队列取出发送到目标?
A:其实我们就是这样干的。任务过来后,先到生产平台,然后放到Redis队列中,这是一个先进先出的队列,然后发送平台从这个队列拿到数据后,直接就发送了。

Q:为啥不用NoSQL数据库?
A:有几个原因,第一是因为我们的发送任务是和其他数据是有关联的,有时候是需要事务的存在的,如果用NoSQL,第一事务就没有了,第二,MySQL已能满足目前的需求和能解决问题,所以就没有考虑NoSQL。

Q:只是按邮箱分表吗?处理完的任务怎么处理?
A:发送完成后,拿到发送任务的ID,把任务状态更新为发送完毕就可以了。

Q:既然Redis有10K这样的性能缺陷,换成其他MQ会不会好一些,比如阿里的RocketMQ。
A:其实在京东也MQ中间件,为什么没有选择,是因觉得在这个场景下,如果用了其他的MQ中间件,有时候,如果你用了新的中间件,也会有其他问题引进来。我们觉得MQ中间件对这个场景太重了一点。目前通过Redis队列已能做到了。Redis队列很常用,我们也知道它很稳定。能满足我们的需要。至于说10K这个问题。我们有可能采用的一种方案是,我们在Redis队列里存的数据,只会存一个Key,我们拿到这Key以后,再去Redis队列重新捞一次发送任务,从而把发送任务从Redis队列里解放出来。

Q:那随着时间的推移,每个表的数据量也是急剧增长吧
A:对,这个表会增长得很多,但会定时删除,我们定期每天晚上都会把数据推送到京东的大数据平台上去。数据库只会保留7天之内的数据。

Q:新平台的研发周期有多长
A:比较快,前后大概三个人,一个半月的时间。

Q:到目前为止,有没有遇到一些新的问题?
A:有个点可以和大家分享一下,就是从生产平台到Redis队列这个位置,最开始,我们做的是一个同步,然后单次写到Redis里去,某个任务来了以后,马上入库,往Redis里写,每次推一个5-8K的数据 ,时间消耗大概是几毫秒,但是,等我们改为批量以后,比如我们从原来一次只推一个到现在一次推5个以后,发现它的开销并没有直接指数倍的增长,所以我们在这里把它改为批量加异步的方式,这里有几个好处就是:对业务方来说,只需要等数据入库成功以后,其实接口就已经返回了。所以后台用了一个定时器,批量的把任务合并,批量地往Redis里写,这样性能上增加了百分之二十。



分享者简介

刘锟洋,京东高级研发工程师,3年从事软件研发经验,独立博主,并发编程网编辑。



                                                        中生代技术群微信公众号

                                                da9312524921e637b684eed7bf3249db58f7badc

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 搜索推荐
知识体系化的必要性及构建通用体系的方法
知识体系化的必要性及构建通用体系的方法
328 0
|
2天前
|
存储 数据可视化
如何高效构建团队知识库?试试看板工具
团队知识管理是提升工作效率的关键。知识管理专家Tiago Forte提出的“第二大脑”概念,强调通过收集、整理、提炼和表达四步法,将零散信息转化为系统知识。教你如何用看板工具构建团队知识库。
16 0
如何高效构建团队知识库?试试看板工具
|
6天前
|
存储 数据可视化 数据挖掘
设计团队高效运作的核心:任务可视化管理
团队协作低效?试试看板管理,让信息同步和流程更清晰,高效提升团队协作!
19 0
设计团队高效运作的核心:任务可视化管理
|
23天前
|
敏捷开发 数据管理 数据挖掘
高效项目管理必备!2024年10款优质软件全解析
在快节奏的互联网行业中,高效的项目管理工具是成功的关键。本文推荐10款优质项目管理软件,包括板栗看板、Asana、Trello、Jira、Microsoft Project等,帮助团队提升效率、优化资源、缩短项目周期。每款工具都有其独特优势,适合不同规模和需求的团队使用。
41 0
高效项目管理必备!2024年10款优质软件全解析
|
13天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
36 0
|
1月前
|
存储 监控 安全
构建高效的个人知识管理系统:技术与实践
【10月更文挑战第5天】在信息爆炸的时代,个人知识管理变得至关重要。本文将介绍如何利用现代技术手段,尤其是开源工具和云服务,构建一个高效的个人知识管理系统。我们将探索不同的知识组织方法,自动化信息的收集与整理流程,以及确保信息安全的策略。通过实际案例和代码示例,本文旨在为读者提供一套可行的解决方案,帮助他们更好地管理个人知识库,提升学习和工作效率。
|
2月前
|
关系型数据库 Java 数据库
探索后端技术:构建高效系统的秘诀
在当今信息技术飞速发展的时代,后端开发作为软件架构中的核心部分,其重要性不言而喻。本文将深入探讨后端技术的各个方面,从基础概念到高级应用,帮助读者全面了解后端开发的世界,揭示构建高效系统的秘诀。
|
4月前
|
监控 Python
系统工程是一个广泛的领域,它涵盖了多个学科和技术的集成,以实现复杂系统的开发、运行和维护。
系统工程是一个广泛的领域,它涵盖了多个学科和技术的集成,以实现复杂系统的开发、运行和维护。
|
6月前
|
数据采集 运维 Kubernetes
我在平台与 AIGC 的交互组件一些设计经验
这里阐述以平台运营为主,这里假设说已经有一个平台,包括技术、数据、运维、管理、运营等基础设施的能力。 这个设计原来主要的问题是超自动化的提升,结合 LLM 为了更好的实现,在这个过程中,也包含了一些自主的感知和学习的能力,带有智能体的一定的特征。在前期的研究中也是不断的查看和摸索了很多的开源项目,包括一出来就热门的 Github 项目,但在使用遇到的情况更多的是还只是属于一些例子或者带有很多不稳定因素,并没有说见到能达到较稳定的层面。
|
6月前
|
SQL 分布式计算 DataWorks
构建高效数据统计服务:阿里云产品实践指南
在今天的数字化时代,数据统计服务对于业务决策和优化至关重要。本文将介绍如何基于阿里云相关产品,搭建一个高效、可扩展的数据统计服务。我们将使用MaxCompute、DataWorks、Quick BI等阿里云产品,通过代码示例和详细说明,带你一步步完成整个流程。
265 0