手机版 欢迎访问魄力云云市场资讯网站

当前位置:主页 > 云虚拟主机 >

新云主机_性价比云服务器

时间:2020-11-02 23:41:19|来源:魄力云|编辑:魄力云|点击:

与阿帕奇·卡夫卡在《纽约时报》上发表文章

在《纽约时报》上,我们有许多用于制作内容的不同系统。我们有几个内容管理系统,我们使用第三方数据和有线新闻。此外,考虑到161年的新闻业和21年的在线发布内容,我们拥有大量的内容档案,这些内容仍然需要在线获取,需要可搜索,并且通常需要提供给不同的服务和应用程序。这些都是我们称之为已发布内容的来源。这是已经编写、编辑并被视为准备供公众使用的内容。另一方面,我们有各种各样的服务和应用程序需要访问这些发布的内容—有搜索引擎、个性化服务、提要生成器,以及所有不同的前端应用程序,如网站和本地应用程序。无论何时发布一个资产,它都应该以非常低的延迟(毕竟这是新闻)提供给所有这些系统,而且不会丢失数据。本文描述了一种新的解决此问题的方法,它基于Apache Kafka®支持的基于日志的体系结构。我们称之为发布管道。本文的重点将放在后端系统上。具体来说,我们将介绍如何使用Kafka存储《纽约时报》曾经发表的所有文章,以及如何使用Kafka和Streams API将已发布的内容实时提供给各种应用程序和系统,以使其可供读者使用。新的体系结构在下面的图表中进行了总结,我们将在本文的剩余部分深入研究该体系结构。图1:new York Times log/Kafka发布架构。基于API的方法的问题需要访问已发布内容的不同后端系统有非常不同的要求:我们有一个为网站和本机应用程序提供实时内容的服务。此服务需要在资产发布后立即使其可用,但它只需要每个资产的最新版本。我们有不同的服务提供内容列表。这些列表中有些是手动管理的,有些是基于查询的。对于基于查询的列表,每当发布与查询匹配的资产时,对该列表的请求需要包括新资产。同样,如果发布的更新导致资产不再匹配查询,则应将其从列表中删除。我们还必须支持对查询本身的更改和新列表的创建,这需要访问以前发布的内容来(重新)生成列表。我们有一个Elasticsearch群集来支持站点搜索。在这里,延迟要求就不那么严格了——如果在资产发布后一两分钟内搜索到它,通常也不是什么大问题。但是,搜索引擎需要容易地访问以前发布的内容,因为每当Elasticsearch模式定义发生更改,或者更改搜索接收管道时,我们都需要重新索引所有内容。我们的个性化系统只关心最近的内容,但每当个性化算法发生变化时,都需要重新处理这些内容。我们以前让所有这些不同的用户访问已发布内容的方法涉及到构建api。内容的生产者将提供用于访问该内容的api,还可以订阅用于发布新资产通知的提要。其他后端系统,即内容的消费者,会调用这些api来获取所需的内容。图2:我们以前基于API的架构的草图,现在已经被本文描述的基于log/Kafka的新架构所取代。这种方法是一种非常典型的基于API的体系结构,它有许多问题。由于不同的api是由不同的团队在不同的时间开发的,所以它们通常以截然不同的方式工作。提供的实际端点是不同的,它们具有不同的语义,并且它们采用不同的参数。当然,这是可以解决的,但这需要多个团队之间的协调。更重要的是,它们都有自己的、隐式定义的模式。一个CMS中的字段名不同于另一个CMS中的相同字段,相同的字段名在不同的系统中可能意味着不同的东西。这意味着每个需要访问内容的系统都必须知道所有这些不同的api及其特性,然后它们将需要处理不同模式之间的规范化。另一个问题是很难访问以前发布的内容。大多数系统没有提供一种有效地流式传输内容归档的方法,它们用于存储的数据库也不支持它(下一节将详细介绍这一点)。即使您有一个所有已发布资产的列表,进行单独的API调用来检索每个单独的资产也会花费很长的时间,并且会给API带来很多不可预测的负载。基于日志架构本文中描述的解决方案使用基于日志的体系结构。这是martinkleppmann在apachesamza[1]中首次提出的一个概念,并在设计数据密集型应用程序[2]中进行了更详细的描述。日志作为一种通用的数据结构包含在日志中:每个软件工程师都应该知道实时数据的统一抽象[3]。在我们的例子中,日志是Kafka,所有发布的内容都按时间顺序附加到Kafka主题中。其他服务通过使用日志访问它。传统上,数据库被用作许多系统的真相来源。尽管数据库有很多明显的好处,但从长远来看,数据库可能很难管理。首先,更改数据库的模式通常很棘手。添加和删除字段并不困难,但是如果不停机,则很难组织更基本的模式更改。更深层次的问题是,数据库变得很难替换。大多数数据库系统没有很好的api来进行流式更改;您可以拍摄快照,但它们会立即过时。这意味着也很难创建派生存储,比如我们用来支持站点搜索的搜索索引纽约时报网在本机应用程序中,这些索引需要包含曾经发布过的每一篇文章,同时在发布新内容时也要保持最新。解决方法通常是客户端同时写入多个存储,当其中一个写入成功而另一个写入失败时,会导致一致性问题。正因为如此,数据库,作为国家的长期维护者,最终往往是一个复杂的整体,试图成为所有人的一切。基于日志的体系结构通过使日志成为真相的来源来解决这个问题。数据库通常存储某个事件的结果,而日志则存储事件本身—因此日志成为系统中发生的所有事件的有序表示。使用此日志,您可以创建任意数量的自定义数据存储。这些存储成为日志的具体化视图-它们包含派生的内容,而不是原始的内容。如果您想更改这样一个数据存储中的模式,只需创建一个新的模式,让它从一开始就使用日志,直到它赶上,然后扔掉旧的。有了日志作为真相的来源,就不再需要所有系统都必须使用的单一数据库。相反,每个系统都可以创建自己的数据存储(数据库)——它自己的物化视图——只表示它需要的数据,以对该系统最有用的形式。这大大简化了数据库在体系结构中的作用,使它们更适合每个应用程序的需要。此外,基于日志的体系结构简化了对内容流的访问。在传统的数据存储中,访问完整转储(即作为快照)和访问"实时"数据(即作为提要)是不同的操作方式。使用日志的一个重要方面是这种区别消失了。您开始在某个特定偏移量处使用日志—这可以是开始、结束或介于两者之间的任何点—然后继续使用。这意味着,如果要重新创建数据存储,只需在开始时就开始使用日志。在某些时候,您将赶上实时流量,但这对日志的使用者是透明的。因此,日志使用者"总是重放"。在部署系统时,基于日志的体系结构也提供了很多好处。在部署到vm时,无状态服务的不可变部署一直是一种常见做法。总是重新部署一个新的问题,而不是从一个新的问题重新部署。有了日志作为真相的来源,我们现在可以对有状态系统进行不变的部署。因为任何数据存储都可以从日志中重新创建,所以我们可以在每次部署更改时从头开始创建它们,而不是就地更改—本文后面将给出一个实际的示例。为什么googlepubsub或AWS SNS/SQS/Kinesis不能解决这个问题apachekafka通常用于解决两个截然不同的用例。到目前为止,最常见的一个是apachekafka被用作消息代理。这可以涵盖分析和数据集成案例。Kafka可以说在这一领域有很多优势,但是像Google Pub/Sub、AWS SNS/AWS SQS和AWS Kinesis这样的服务有其他方法来解决同样的问题。这些服务都允许多个消费者订阅由多个生产者发布的消息,跟踪他们看到和没有看到的消息,并且优雅地处理消费者停机时间而不丢失数据。事实上,卡夫坎是这些案例的一个具体应用。基于日志的体系结构(如本文所述)是不同的。在这些情况下,日志不是实现的详细信息,它是中心功能。要求与其他服务有很大不同

云主机服务商 Ucloud云计算 移动云数据 云存储服务器 Ucloud云主机 云计算提供商 阿里数据库 服务器租用 云储存服务器 Web云服务器 ucloud云数据库 独享云主机 云服务器服务商 海外云存储 云服务器主机 云计算解决方案 国内云存储 数据库云平台

Copyright © 2002-2020 魄力云 版权所有