构建高效的EDM平台经验

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
目录
相关文章
|
1天前
|
存储 人工智能 搜索推荐
如何用SaaS工具提升团队写作效率,实现高效协作?
在数字化时代,内容创作成为企业营销和个人品牌塑造的关键。SaaS工具通过云端存储、AI辅助写作、数据分析和流程自动化,重塑了内容创作流程,提高了写作效率和文章质量。尤其在团队协作方面,如板栗看板等工具提供了可视化任务管理、高效协同编辑和自动提醒功能,确保内容按时高质量发布。此外,SaaS工具还能优化SEO,提升文章的搜索引擎排名,吸引更多流量,帮助创作者在竞争中脱颖而出。
|
存储 前端开发 JavaScript
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
构建高效学生志愿者活动管理系统:基于前后端分离的设计与实现
|
数据可视化 前端开发 Java
个人开发者是否能借助开源获利?
近几年国内外开源软件的成倍增长,以及开源软件在互联网领域的比重越来越高,开源软件扮演者越来越重要的角色,所以开源软件不仅推动了技术领域的不断创新和发展,也给个人开发者们提供了越来越多的合作机会和获利的机会。
115 0
个人开发者是否能借助开源获利?
|
4月前
|
存储 监控 安全
构建高效的个人知识管理系统:技术与实践
【10月更文挑战第5天】在信息爆炸的时代,个人知识管理变得至关重要。本文将介绍如何利用现代技术手段,尤其是开源工具和云服务,构建一个高效的个人知识管理系统。我们将探索不同的知识组织方法,自动化信息的收集与整理流程,以及确保信息安全的策略。通过实际案例和代码示例,本文旨在为读者提供一套可行的解决方案,帮助他们更好地管理个人知识库,提升学习和工作效率。
113 2
|
1月前
|
安全 网络协议 网络安全
活动实践 | 低代码高效构建企业门户网站
本方案介绍如何使用魔笔平台快速构建和部署企业网站。通过DNS解析与Mobi平台建立SSL加密连接,确保数据安全传输。魔笔提供丰富的组件库和拖拽式界面设计工具,简化开发流程,支持快速开发、易于学习和安全可靠的特点。首次使用需登录魔笔控制台开通功能,并通过ROS控制台一键部署模板。编辑网站时,可轻松添加组件、管理后台数据并发布更新。最后,可通过资源栈页面清理不再需要的资源,确保环境整洁。
|
12天前
|
存储 数据可视化 数据安全/隐私保护
如何打造高效设计团队?这些工具一定要用!
在数字化时代,设计团队的工作方式从传统手绘演变为跨平台、多维度的协同创作。本文探讨了设计团队必备的软件类别,如视觉设计工具、原型与交互设计工具、3D建模与动画工具等,并介绍了如何利用“板栗看板”提升设计管理效率,确保任务顺利推进。高效的任务管理和协作工具是设计团队成功的关键,不仅提升创意效率,还能优化整体工作流,确保项目按时交付。
42 12
|
9月前
|
数据处理 API Android开发
安卓应用开发:构建一个高效的通知管理系统
【5月更文挑战第25天】在移动操作系统中,通知管理是用户体验的核心组成部分。特别是对于安卓设备,由于其开放性和多样性,有效的通知管理系统显得尤为重要。本文将详细介绍如何在安卓平台上构建一个高效、用户友好的通知管理系统。我们将从通知渠道的管理、用户自定义设置以及后台数据处理等方面展开讨论,并提供实用的代码示例和最佳实践建议。
|
搜索推荐 数据挖掘 BI
1024低代码训练营-day3 流程&报表设计|学习笔记
快速学习1024低代码训练营-day3 流程&报表设计
1024低代码训练营-day3 流程&报表设计|学习笔记
|
9月前
|
SQL 分布式计算 DataWorks
构建高效数据统计服务:阿里云产品实践指南
在今天的数字化时代,数据统计服务对于业务决策和优化至关重要。本文将介绍如何基于阿里云相关产品,搭建一个高效、可扩展的数据统计服务。我们将使用MaxCompute、DataWorks、Quick BI等阿里云产品,通过代码示例和详细说明,带你一步步完成整个流程。
339 0
|
7月前
|
数据可视化 数据挖掘 数据库
低代码开发全解析核心功能及其优势
低代码开发平台采用图形界面与预构建组件加速软件开发,降低技术门槛与成本,并支持敏捷迭代与快速部署。其核心功能包括可视化建模、预构建组件库、业务流程自动化、集成与连接性、多平台应用开发、数据分析报告、版本控制与协作、测试调试工具、安全性与合规性及快速部署更新。优点体现在提升开发速度与效率、降低成本、加强团队合作及提高灵活性与可扩展性。选择平台时需明确需求、评估功能与灵活性、考虑易用性、集成能力、安全性与合规性及成本与定价模型。例如,Zoho Creator作为成熟平台,拥有丰富的经验和广泛的应用案例。低代码开发已成为企业数字化转型的关键工具。
143 13

热门文章

最新文章