【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

Expedia 使用 WebSocket 和 Kafka 实现近实时的数据流查询

作者:Rafal Gancarz

  • 2024-01-13
    北京
  • 本文字数:1134 字

    阅读完需:约 4 分钟

Expedia 使用 WebSocket 和 Kafka 实现近实时的数据流查询

Expedia 实现了从他们的平台近实时地查询点击流数据的解决方案,这让他们的产品和工程团队可以在开发新的和增强现有数据驱动的特性时能够进行实时的数据探索。该团队使用了 WebSocket、Apache Kafka 和 PostgreSQL 的组合,可以连续向用户浏览器流式传输查询结果。


Expedia 的多个来源会产生大量数据,包括网站上的交互。用户在浏览网站或与网页元素进行交互时收集的点击流数据可以提供宝贵的用户行为见解。Expedia Group 的数据工程师(目前在 Personio)Ryan Lacerna 解释了近实时查询的优势:


为了确保数据质量,我们面临的一个挑战是在数据注入管道后可以立即查看数据。传统的方法,如查询数据湖和数据仓库,需要较长的处理时间,而基于事件驱动的工具可以让用户快速高效地查询和查看流式数据,为数据生产者提供快速反馈,让数据使用者可以了解捕获了哪些数据。


该团队选择使用 WebSocket 实现网页浏览器和服务器之间的双向实时通信。使用 WebSocket 的优势在于可以避免不断刷新服务器数据。此外,WebSocket 基于单个长连接,可以提高性能和最小化资源开销。



近实时查询解决方案的架构(来源:Expedia 工程博客)


该解决方案包含了 UI 应用程序、WebSocket Handler 和 Filter Worker,并使用了 Apache Kafka 主题和 PostgreSQL 数据库。UI 提供了一个简单的查询表单,用户可以指定要显示的点击流事件类型,并提供了一个通过 WebSocket 发送查询结果的小部件。UI 应用程序使用 SockJS 库和 [STOMP 协议] 实现 (https://en.wikipedia.org/wiki/Streaming_Text_Oriented_Messaging_Protocol) 与服务器的交互。


在服务器端,WebSocket Handler 负责处理 STOMP 格式的查询,并将流式结果发送回浏览器。Handler 从 Apache Kafka 主题读取经过筛选的点击流事件。Filter Worker 负责基于活动查询将经过筛选的事件流发布到 WebSocket Handler 订阅的 Kafka 主题中。这两个服务在 Kubernetes 运行了多个副本,具备了可伸缩性。


服务使用 PostgreSQL 数据库来同步查询的细节,其中包括点击流事件的筛选条件。WebSocket Handler 将查询过滤器持久化到数据库表中,并在用户断开会话或 TTL(生存时间) 到期(在用户会话存在的情况下)时将其删除。该解决方案依赖了 Postgres 的 LISTEN/NOTIFY 功能,确保 Filter Worker 根据数据库的变更保持其内存缓存的最新状态。



将筛选事件路由给用户(来源:Expedia 工程博客)


与源主题相比,Filter Worker 服务显著减少了发布到筛选主题的事件的数量。发布到筛选主题的消息使用 Filter ID 作为键,WebSocket Handler 利用这个 ID 将消息路由给正确的用户。这种方法还支持对 WebSocket 层进行扩展,在工具用户数量增长时处理更大的负载。


原文链接


https://www.infoq.com/news/2023/12/expedia-websockets-kafka-query/


2024-01-13 08:0012113

评论

发布
暂无评论

谷歌三件套 - Bigtable

懒时小窝

bigtable 谷歌 谷歌三件套

linux之crontab使用技巧

入门小站

Linux

电商系统微服务拆分

Trent

架构 微服务拆分 电商 训练营

Kubernetes 节点弹性扩展实践组件 Amazon Karpenter:部署 GPU 推理应用

亚马逊云科技 (Amazon Web Services)

Kubernetes 部署

python小知识-python 函数二三事

AIWeker

Python 5月月更

【C 语言】指针 Five 之 ["⚔ 野指针,🗡 如何规避野指针,💣 指针的未初始化,💣指针越界访问"]

謓泽

C语言 5月月更

Java Core「1」JUC-线程基础

Samson

学习笔记 5月月更 Java core

Amazon CodePipeline 与 GitHub 集成

亚马逊云科技 (Amazon Web Services)

GitHub Code

模块六作业 微服务拆分

库尔斯

架构实战营

Sentinel介绍与使用 收藏起来

牧小农

sentinel

小公司里面的 Python 后端,数据库(MySQL)到底要学习到什么程度?

梦想橡皮擦

5月月更

Linux 入门及常见Shell命令

宇宙之一粟

Linux Shell 5月月更

SpringMVC源码分析:POST请求中的文件处理

程序员欣宸

Java spring 5月月更

拆分电商系统为微服务

Dean.Zhang

模块6作业提交

KennyQ

数据结构-复杂度计算经典案例

芒果酱

数据结构 算法 5月月更

react-router原理分析

正经工程师

React React-Router

架构学习(一)

爱晒太阳的大白

5月月更

Flutter 使用 Provider 实现嵌套状态管理

岛上码农

flutter ios 安卓开发 跨平台开发 5月月更

flask框架【入门学习笔记一】

恒山其若陋兮

5月月更

【刷题第16天】数组中出现次数超过一半的数字

白日梦

5月月更

在线HTML转JSON工具

入门小站

工具

LinkedList 源码分析-迭代器

zarmnosaj

5月月更

密码学系列之:在线证书状态协议OCSP详解

程序那些事

密码学 程序那些事 5月月更

在线蚂蚁文,菊花文生成工具

入门小站

工具

PostgreSQL出现死锁怎么办?

慕枫技术笔记

数据库 5月月更

[ CloudWeGo 社区动态 ] Kitex 电商项目案例

baiyutang

Go 微服务 5月月更

SAP OData V4 模型支持的一些数据绑定模式

Jerry Wang

JavaScript 前端开发 SAP ui5 5月月更

八、浅谈云原生监控

穿过生命散发芬芳

云原生 5月月更

VS Code配置markdown代码片段

空城机

前端 vscode 5月月更

数学建模学习资料

乌龟哥哥

5月月更

Expedia 使用 WebSocket 和 Kafka 实现近实时的数据流查询_业务架构_InfoQ精选文章