实时事件驱动的应用程序的兴起导致了现代技术堆栈的开发,这些堆栈可以实时处理大量事件。实时事件驱动的应用程序的特征是它们在发生时立即响应事件的能力,为用户提供最新信息和更快的反馈。
要为实时事件驱动的应用程序构建现代堆栈,您需要考虑几个组件和技术,这些组件和技术可以处理事件处理的不同阶段,从事件收集到用户界面。在本文中,我们将在实时事件驱动的在线应用程序架构中讨论现代堆栈的各个组件,该型号提供折扣信息来自城市中不同市场的折扣信息。
。学习目标
在本文结尾处,您将学习:
- 了解服务器连续轮询数据的局限性。
- 为折扣Web应用程序构建事件驱动的架构。
- 如何实时向用户显示数据。
了解应用程序用例和要求
一个网站或移动应用程序,向客户提供来自城市不同市场的折扣信息,对于希望 省钱的购物者来说,这是一个有用的工具。该应用程序可以提供有关各个市场折扣和交易的实时信息,从而使用户可以快速,轻松找到最佳交易。
下图显示了我们在移动应用程序上打开网站的时间:
客户可以使用本网站比较不同市场的价格 和接收通知有关在这些市场创建后立即接近其当前地点的折扣和交易的通知 实时条目系统。他们可以使用该应用程序根据可用折扣和交易来计划购物旅行并预算购买。
此应用程序的一些核心技术要求可能包括:它应提供有关各个市场折扣和交易的实时信息,请确保客户可以访问最新的信息,并根据用户的位置过滤这些数据。也许它也应该允许用户搜索折扣和基于特定产品或类别的交易。实施用户身份验证根据用户的偏好提供个性化交易信息。
这是一个重要的问题:我们如何向用户显示实时折扣信息(当他们使用该网站时),因为这些数据出现在城市市场中?本网站架构,让我们只专注于寻找解决方案,以实时从服务器检索折扣数据。
评估第一个典型解决方案
第一个可能的直接体系结构通过基于的计时器从服务器中获取更改,并在single-page前端应用程序上显示它们,以报告折扣信息。该页面使用计时器每三秒钟向服务器发送请求以请求折扣。响应返回一系列折扣,然后将其显示给用户。
这种设计被称为timer-based投票方法。示例客户端可以使用JavaScript库(例如ReactJS)来撰写网站UI和Axios HTTP客户端来处理到后端API端点的请求(可以使用REST和任何后端框架构建后端,例如NodeJS或任何低代码的后端框架框架)。
另一个集成的API定期更新折扣信息,该API面对来自不同市场的外部呼叫(它可以使用a webhook endpoint通过提供呼叫端点来提供新的市场折扣,然后在服务器中存储在服务器中的服务器中。关系数据库(MySQL,PostgreSQL)。当我们的后端折扣API由客户端网站的HTTP请求触发时,它将返回数据库中的内容。
当前解决方案的局限性
实际问题在于我们从数据提供商中获取市场折扣数据的速度,而是我们将其传递到UI的速度(假设数据已经存储在我们的数据库中,我们可以分析和处理此数据)。让我们考虑一下这种方法的弱点。
在折扣前端应用程序和后端服务之间,有不断的民意调查请求进行更改。因为它是基于计时器的,所以客户端应用程序是否存在对基础数据存在的更改是否存在。从服务器返回数据后,全部折扣列表将在网页上更新 - 无论数据中的任何更改。这是高效的,当数据库中没有任何更新时,调用可能会导致空的有效载荷。另外,如果称为HTTP API接受我们的HTTP请求,但是需要很长时间才能处理,这可能会影响用户体验,尤其是当行为反映在用户界面中时刷新页面以获取折扣的最新更改)。
一旦您更熟悉第一个Web应用程序架构及其局限性,就该引入新的设计来解决上述问题。
实时事件驱动数据交换
Event-Driven Architecture (EDA)似乎是满足上述技术要求的理想选择。在事件驱动的体系结构中,组件被设计为对事件发生时的反应,而不是被其他组件或服务所调用。正是我们想要的,而不是不必经常对后端进行更改,而是使用基于推动的方法,并让后端服务器自动向所有连接的客户发送消息或通知。
在这里,实时是指我们系统立即响应事件或输入的能力,或者是在很短的时间内。在折扣Web应用程序的上下文中,这意味着在发生折扣事件时,没有任何明显的延迟。
下图显示了折扣应用中组件的新架构。该体系结构显示4 主要阶段从我们检测折扣数据更改开始, ingest 和传播它们到活动消费者在UI上显示。基本上,它是第一个溶液设计的反向流。
让S分解每个组件并了解其在下一部分中的角色。
新的体系结构故障
这种新设计为我们的折扣数据添加了实时功能,减少流量,并仅通过随着数据的更改而更新,从而使UI更有效。但是它利用一些开源技术和工具进行事件流。
第一个组件是数据库,它可以充当数据源,可以是postgresql(其他流行的选项包括mongodb或mysql)。随着数据库中的数据更改,使用基于日志的CDC(更改数据捕获)功能检测到更改。它捕获更改并将其记录在事务日志中。然后,捕获的更改将转换为一个变更事件,下游系统(消息经纪)(例如Kafka)可以实时消费。
我们将使用Debezium connector for Postgres以从数据库到KAFKA的事件流的形式提取这些CDC日志。一旦我们的折扣活动进入Kafka,RisingWave等流媒体数据库就可以订阅Kafka主题的此更改提要。然后,RisingWave以materialized views的形式将其读取并将其存储在其本地持久存储中,以实现fault tolerance。换句话说,它可以充当一个可以实现CDC事件的状态流处理器流到代表当前状态的关系数据库表中。流媒体数据库可帮助我们快速实时建立实现的视图,该视图根据用户指定的匹配标准显示所有折扣信息,或者在所选产品上准备统计数据,或者从不同市场的结果中找到最接近的交易。此外,它使我们能够通过将数据传递到 bi和数据分析平台来分析数据,以根据我们的Web应用程序使用来做出更好的业务决策。
RisingWave是一个专门从事实时分析的流数据库,可以直接读取来自Postgres binlogs or Kafka topics的数据库更改事件,并通过将多个事件结合在一起来构建实现的视图。随着新事件的到来,RisingWave将使视图保持最新状态,并允许您使用SQL查询以访问对数据进行的最新更改。
通过实时使用sink operation,流数据库将结果写回KAFKA主题。现在,我们需要添加JavaScript代码以消耗和处理从Kafka接收的折扣消息,并实时更新UI以显示它们。我们可以使用KafkaJS库,该库是Node.js的热门Kafka客户端来聆听和消费Kafka消息。
现在,您可以在React Native组件中使用此KAFKA消费者功能来更新UI,因为收到了新的折扣数据。
结论
在这篇文章中,我们学会了如何为Web应用程序设计架构,该应用程序提供来自不同市场的实时折扣信息。 Web应用程序可以帮助用户找到最佳交易并做出明智的购物决策。我们评估了两种不同的解决方案,这些解决方案实施了时间触发的轮询和使用均匀驱动的模式。
我们了解,为实时事件驱动的应用建立现代堆栈需要一系列技术。可以使用流处理器,流数据库,现代JavaScript框架和库的组合。流数据库处理复杂的查询,这些查询通常通过预先计算其缓存中的结果来改变。在第二个体系结构中,我们没有引入任何实现自定义流处理逻辑的其他服务/微服务,从而导致运营开销和部署的复杂性增加。
相关资源
- How to choose the right streaming database
- Issue SQL queries to manage your data
- Query Real-Time Data in Kafka Using SQL
- How Change Data Capture (CDC) Works with Streaming Database
建议的内容
社区
1 Join the Risingwave Community
关于作者
访问我的个人博客:www.iambobur.com