微服务篇:通过查询实施数据解放

本文涉及的产品
云原生网关 MSE Higress,422元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 基于查询的数据解放涉及查询数据存储并将所选择的结果发布到相关的事件流中。一个使用合适的 API、SQL 或类 SQL 语言的客户端会被用于向数据存储请求特定的数据集。必须能够批量查询数据集以提供事件的历史记录,然后定期更新,以确保数据的更改被发布到输出事件流中。

网络异常,图片无法展示
|

通过查询实施解放

基于查询的数据解放涉及查询数据存储并将所选择的结果发布到相关的事件流中。一个使用合适的 API、SQL 或类 SQL 语言的客户端会被用于向数据存储请求特定的数据集。必须能够批量查询数据集以提供事件的历史记录,然后定期更新,以确保数据的更改被发布到输出事件流中。

此模式有几种查询类型。

批量加载

执行批量查询并加载数据集中的所有数据。当需要在每个轮询间隔加载整张表时,以及在进行增量更新之前,都需要执行批量加载。

批量加载成本很高,因为它需要从数据存储中获取整个数据集。对较小的数据集,这可能不是问题,但对大规模的数据集,特别是那些有百万或亿万条记录的数据集来说,则可能很困难。对于查询和处理大规模数据集的情况,我建议研究针对特定数据存储的最佳实践,因为这些最佳实践可能因存储器的实现而不同。

增量时间戳加载

使用增量时间戳加载,可以查询并加载自上一个查询结果的最大时间戳以来的所有数据。这种方法使用数据集中的一个 updated_at 列或字段来跟踪记录最后一次修改的时间。在每次增量更新时,只查询 updated_at 时间戳晚于最后一次处理时间的记录。

自增ID加载

自增 ID 加载是查询并加载比上一次处理的 ID 值大的所有数据。这需要一个严格有序的整型或长整型字段。在每次增量更新时,只查询 ID 值比上一次处理的 ID 值大的记录。这种方法通常用于查询存储不可变记录的表,比如发件箱表(参见 4.6 节)。

自定义查询

自定义查询仅受限于客户端查询语言。当客户端只需要较大数据集中的某个数据子集时,或者联结多个表中的数据并对其进行非范式化以避免内部数据模型过度暴露时,通常使用这种方法。例如,用户可以根据特定的字段过滤业务伙伴的数据,然后将每个合作伙伴的数据发送到自己的事件流。

增量更新

任何增量更新的第一步都是确保数据集中的记录有必需的时间戳或自增 ID。必须存在一个字段让查询可用于从要处理的记录中筛选出已被处理的记录。缺失这些字段的数据集需要把它们加上,数据存储需要配置成可以填充必需的 updated_at 时间戳或自增 ID 字段。如果这些字段无法添加到数据集中,那么基于查询的模式就无法使用增量更新。

第二步是确定轮询频率和更新时延。较高的更新频率可以为下游系统带来较低的数据更新时延,但是这会给数据存储造成比较大的总负载开销。考虑请求之间的间隔是否足以完成所有数据的加载也很重要。当旧的查询仍在加载时开始新的查询可能会导致竞争状态,即旧数据会覆盖输出事件流中较新的数据。

一旦选定增量更新字段并确定了更新频率,最后一步就是在增量更新启动之前执行一次批量加载。这次批量加载必须在进一步增量更新之前查询并生成数据集中的所有存量数据。

基于查询更新的优点

基于查询的更新具有以下优点。

可定制性

 可以查询任何数据存储,并且所有客户端类型都能用于查询数据。

独立的轮询周期

  可以以较高的频率执行某些特定查询以满足更严格的 SLA,而对于其他开销较大的查询可以降低执行频率以节省资源。

内部数据模型的隔离

  关系型数据库可以通过使用底层数据的视图或物化视图来达到与内部数据模型的隔离。该技术可用来隐藏不应该暴露在数据存储之外的领域模型信息。

 请记住,被解放的数据将是单一事实来源。要考虑是否隐藏或忽略了应该被解放的数据,或者是否应该重构源数据模型。这通常发生在数据被从遗留系统里解放出来的过程中,在这些系统里,业务数据和实体数据已经随着时间的推移相互交织在一起。

基于查询更新的缺点

基于查询的更新也有一些缺点。

需要 updated_at 时间戳

  要查询的事件的底层表或命名空间必须有一列包含着它们的updated_at 时间戳。这对于跟踪最近一次的数据更新时间来做增量更新至关重要。

无法跟踪的硬删除

  硬删除无法在查询结果中体现,所以要跟踪删除只能采用基于标记的软删除,比如 is_deleted 列。

数据集 schema 和输出事件 schema 之间脆弱的依赖关系

数据集 schema 变更时可能会出现与下游事件 schema 格式规则不兼容的情况。如果数据解放机制的代码与数据存储应用程序的代码是分离的,则崩溃的可能性会越来越大,这在基于查询的系统中很常见。

间歇捕获

  数据只能在间歇性轮询中同步,这样对同一个记录的多次独立变更只能体现为一个事件。

生产资源消耗

  查询使用底层系统资源来执行,这会在生产系统上造成不可接受的时延。使用只读副本可以减轻此问题,但会带来额外的财务成本和系统复杂性。

数据变更导致的查询性能变化

  查询和返回的数据量取决于对底层数据所做的变更。在最坏的情况下,每次都会更改整个数据集。如果某次查询在下一次查询开始时仍未结束,则会出现竞争状态。

相关文章
|
8月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
663 0
|
8月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
420 0
|
8月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1240 0
|
8月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
143 0
|
8月前
|
存储 JSON NoSQL
微服务——MongoDB的数据模型
MongoDB采用文档(document)作为最小存储单位,类似关系型数据库中的行,使用BSON(Binary-JSON)格式存储数据。BSON是JSON的二进制扩展,支持内嵌文档和数组,新增了如Date、BinData等特殊数据类型,具有轻量、高效、可遍历的特点,适合非结构化与结构化数据存储。其灵活性高,但空间利用率略低。BSON数据类型包括string、integer、boolean等基本类型及date、object id等扩展类型。
214 0
|
消息中间件 Kafka 微服务
微服务数据问题之MetaQ设置同步异步刷盘如何解决
微服务数据问题之MetaQ设置同步异步刷盘如何解决
103 0
|
消息中间件 存储 微服务
微服务数据问题之异步刷盘如何解决
微服务数据问题之异步刷盘如何解决
132 0
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
184 6
|
安全 网络安全 数据安全/隐私保护
云原生技术探索:容器化与微服务架构的实践之路网络安全与信息安全:保护数据的关键策略
【8月更文挑战第28天】本文将深入探讨云原生技术的核心概念,包括容器化和微服务架构。我们将通过实际案例和代码示例,展示如何在云平台上实现高效的应用部署和管理。文章不仅提供理论知识,还包含实操指南,帮助开发者理解并应用这些前沿技术。 【8月更文挑战第28天】在数字化时代,网络安全和信息安全是保护个人和企业数据的前线防御。本文将探讨网络安全漏洞的成因、加密技术的应用以及提升安全意识的重要性。文章旨在通过分析网络安全的薄弱环节,介绍如何利用加密技术和提高用户警觉性来构建更为坚固的数据保护屏障。
|
监控 API 开发者
深入理解微服务架构:设计与实施
【10月更文挑战第7天】深入理解微服务架构:设计与实施
268 0

热门文章

最新文章