BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Yelp的实时流技术之五:数据管道之Salesforce Connector

| 作者 Ian F 关注 0 他的粉丝 ,译者 足下 关注 1 他的粉丝 发布于 2016年11月24日. 估计阅读时间: 10 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

本文翻译自Data Pipeline: Salesforce Connector,原作者为Ian F.,已获得原网站授权。

这是关于Yelp的实时流数据基础设施系列文章的第五篇。这个系列会深度讲解我们如何用“确保只有一次”的方式把MySQL数据库中的改动实时地以流的方式传输出去,我们如何自动跟踪表模式变化、如何处理和转换流,以及最终如何把这些数据存储到Redshift或Salesforce之类的数据仓库中去。

阅读本系列的第一篇:
中文:一天几十亿条消息:Yelp的实时数据管道
英文:Billions of Messages a Day - Yelp's Real-time Data Pipeline

阅读本系列的第二篇:
中文:Yelp的实时流技术之二:将MySQL表数据变更实时流到Kafka中
英文:Streaming MySQL tables in real-time to Kafka

阅读本系列的第三篇:
中文:Yelp的实时流技术之三:不止是模式存储服务的Schematizer
英文:More Than Just a Schema Store

阅读本系列的第四篇:
中文:Yelp的实时流技术之四:流处理器PaaStorm
英文:PaaStorm: A Streaming Processor

Yelp用客户关系管理(customer relationship management,CRM)平台Salesforce来为超过2000人的销售团队提供支持。Salesforce提供了许多现成的功能,让我们的销售团队可以轻松地定制他们的业务流程。

我们的销售团队主要做什么呢?他们卖广告包!他们卖给谁呢?Yelp上的商家!那我们如何从Yelp的数据库中获取这些商家信息并提供给Salesforce呢?读过下文你就明白了。

以前的方法

我们现有的单向同步基础架构名为“Bulk Workers”,是早在2010年设计的了,目的是要显著地改进端到端发送数据的时间。这套设计方案成功地把同步时间从3星期缩短为24小时,这很棒!这套方案细节是怎样的呢?

这些“Bulk Workers”实际上就是一些Gearman定时任务,它们会检索业务表中的每一行数据,再按Salesforce的模式对这些数据进行转换。转换后的数据会用一个Salesforce客户端发送给Salesforce,客户端是基于Beatbox开发的,主要的改进是增加了对Salesforce批量API的支持。

旧的集成方法

上面的方法一直工作得很好……直到它再也顶不住的时候。

在接下来的5年里,这套架构见证了数据的急速增长,从最初的30万亿行,到2015年超过了100万亿行。数据更新的操作影响尤其大。后来,同步时间开始越拖越长。我们就知道我们需要优化一下系统,来更好地支持更新操作了。

进入正题:数据管道

于是我们开始收集需求。我们认为新的解决方案需要下面这些:

  • 实时处理
  • 保证“至少一次提交”
  • 自带监控和告警等功能
  • 由配置驱动模式之间的转换
  • 可以很容易地增加新字段和转换

差不多是在相同的时间点,我们已经在做依靠分布式发布/订阅消息系统Kafka新数据管道了。这个数据管道可以直接满足我们的前三个需求。那我们剩下的工作就是构建一个转换框架来满足后面的两个需求,并且作为到Salesforce.com的连接器。

Salesforce数据管道集成方法

转换器(Transformer)

我们采用了一个名为PaaStorm的、在Yelp Hackathon上产生的并且已经应用到生产环境的项目作为我们的Kafka-to-Kafka处理器,叫这个名字是因为它与Storm很相似,并且是用Yelp PaaSTA部署的。在保留了Storm的范式的前提下,我们构建了一个通用的转换器,可以生成许多实例,处理各个Topic中的要发往Salesforce的原始数据。在处理源Topic时,每个实例都会从一个YAML文件中得到转换步骤,然后再做拷贝、移动和(或)值映射操作。这很重要,因为Salesforce的模式存在的时间远远长于我们的新架构,是很难改动的。这个也意味着没有什么比较自动的方法去做字段映射。如果有一个由配置驱动的映射关系,那就让我们可以快速对转换做解析而不必真正地部署代码。这对项目的灵活性至关重要。

每个转换器都会向一个新的Kafka Topic中发布序列化后的Salesforce对象,供上传器消费并发往Salesforce。

上传器(Uploader)

让上传器自己做为一个实例就可以让我们清楚地知道我们有多少个服务要与Salesforce.com通信。上传器会消费各个转换器转换后的消息,将它们批量发送到Salesforce。因为发往Salesforce的请求是发向互联网的,所以这是我们的管道中最慢的部分之一。因而能不有效地进行批量处理就对性能影响非常大。使用合适的API也非常重要。因为Salesforce提供了好多种不同的API,所以有时候选择用哪个也不容易。为了让我们可以很容易地不必做更多的工作就在API之间切换,我们写了个通用的客户端,用它包装了现有的SOAP、REST和批量API等Python客户端。我们也写了一个ORM(Object-Relational Mapping)客户端,并为每张我们要写的目标表定义了模型。这让我们可以在发送到Salesforce.com之前就对数据进行验证,并且在写数据的时候确认该用哪个Salesforce External ID

评估

我们用来评估的第一张表就是我们的广告商表。选它是因为它是我们Yelp整体业务中规模比较小的表之一,但对于我们的销售团队的运作又是非常重要的。在之前要把数据变更操作从Yelp同步到Salesforce需要16小时。在切换到新架构之后,可以看到同步时间变成了平均约10秒钟,偶尔会有一些波峰,但也就只是变为几分钟而已!这就足以表明出现在Salesforce上的数据是非常可靠的,销售团队在查看数据时,再也不必不断地来要更新的数据了。

每秒钟平均同步延迟

挑战

听起来很容易?事实上并非如此。在设计和构建我们的连接器的过程中,我们要解决好几个问题:

我们注意到在处理失败的更新操作中有很大部分都是在Salesforce一侧超时了,或者是由于没能成功的为某行数据获取锁而被拒绝了。这两种问题的根本原因都在于我们在Salesforce的程序中使用了大量的触发器和回滚操作。差不多每张表上都有非常复杂的逻辑,而每一条写操作都要把这些逻辑全处理一遍,以保证不同数据之间的一致性,或者为了将某些业务流程自动化。这些功能本来都是很好的,但碰上问题时你就不那么想了。所以我们工作的重点就是要减少做写操作时的处理量。把这样的处理尽可能地挪到异步处理的过程中,就可以减少我们锁定单条记录的时间,也就减少了每条写操作的处理时间。

另一个要解决的问题是依赖关系。我们本来的数据源(MySQL)有限制依赖,而Kafka并没有。虽然写到每个Kafka Topic中的消息都是保证有序的,但是我们并不能保证这些Topic中的数据会以某个确定的速度被处理。在各张表都彼此依赖的情况下这个问题就很严重,因为一张表中的数据可能会比另一张表的数据更先被读取和更新,导致数据在一定时间内处于不一致的状态。一个常见的例子就是广告商的数据记录会比用户的数据稍早到一会。因为广告商的数据中包含一个指向User表的外键字段,写入就会失败。因此我们就要跟踪哪些数据是因为不符合依赖约束而写入失败的,然后再由上传器在确定依赖关系满足了之后再重试。把上传的操作按依赖顺序序列化并处理重试,这可以覆盖我们绝大多数的用例,尽管这意味着我们因此没办法达到一个很高的并行度。

还有一个问题,就是我们的数据没有全放在一个单一的数据库里面,所以对我们来说可用的就是单条的数据记录。为了解决这样的问题我们开发了新功能,读两个Topic中的数据并把它们关联起来,然后再把关联后的数据重新发布出去。

结论

使用基于Kafka的数据管道来为销售团队获取数据,我们已经在这方面取得了很大改进。接下来我们准备构建自己的基础架构,这样就可以实现其他的转换操作、简单的聚合、以及在写Salesforce的高可靠保障等等功能。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT