【问题标题】:Reading huge file and writing in RDBMS读取大文件并在 RDBMS 中写入
【发布时间】:2019-12-16 09:00:09
【问题描述】:

我有一个巨大的文本文件,它不断地从一个公共位置附加,我需要从我的 java 应用程序中逐行读取并在 SQL RDBMS 中更新,这样如果 java 应用程序崩溃,它应该从它的位置开始离开而不是从头开始。

它是一个纯文本文件。每行将包含:
<Datatimestamp> <service name> <paymentType> <success/failure> <session ID>

此外,从数据库中检索的数据也应该是实时的,在 Web 应用程序中没有任何性能、可用​​性或可用性问题

这是我的方法: 在两个系统框中部署应用程序,每个系统都包含心跳,用于 ping 另一个系统以获得服务可用性。 当您获得对心跳的成功响应时,您还将获得最后一次成功读取的时间戳。 当下一个心跳响应失败时,另一个系统中的应用程序可以接管,基于: 1. 响应失败 2. 上次成功的时间戳。

另外,由于数据检索的需求非常实时且数据量很大,我可以抓取数据库并将其放入 Solr 或 Elastic 搜索中以加快检索速度,而不是进行数据库调用吗?

有多种方法可以做到,最好的方法是什么。

【问题讨论】:

  • 您是将文件内容放在数据库中的单个记录中,还是在表中单独的行中?即使没有平衡系统,您也可以实现一种方法,在启动时检查文件是否与数据库位于同一点,如果不是,则开始读取记录(因为我认为您的应用程序不会停机太久?)
  • 这将是表格中的单独行。
  • 该问题没有详细说明所需的“实时”输出。是报告吗? Web应用程序? OLAP?什么?
  • 如果您满足于使用 NoSQL 数据库,为什么要通过 RDBMS 作为中间人?您可以从文件直接插入 NoSQL 数据库
  • 什么是巨大的? RDBMS 可以轻松处理多达 1B 行的表。检索要求是什么? (搜索条件)是否仅按字段相等的值进行搜索?有文字搜索吗?常规表达式?在决定 DBMS 和客户端应用程序时,您是否需要扫描行并聚合(总和、平均)所有这些需要考虑的因素

标签: java rdbms distributed-transactions


【解决方案1】:

我会在文本文件和数据库写入应用程序之间放置一个消息传递系统。 (例如RabbitMQ)在这种情况下,消息传递系统充当队列。一个应用程序不断读取文件并将行作为消息插入到代理。另一方面,多个“数据库写入应用程序”可以从队列中读取并写入数据库。

消息系统的优势在于它支持从队列中读取的多个客户端。消息系统负责客户端之间的同步,处理错误、死信等。客户端不关心其他实例处理了什么有效负载。

关于维护“数据库写入应用程序”的多个实例:我会选择现成的集群解决方案。也许是由 kubernates 管理的 docker 集群?

另一个可行的选择是流媒体平台,例如Apache Kafka

【讨论】:

  • 这将如何处理最终从数据库中实时检索的数据。
  • 但是,请确保将 Kafka 配置为完全一次交付,否则如果您有多个写作应用程序,您的记录可能会在数据库中重复。
  • 数据检索有什么要求?期望的输出是什么?是报告吗?一个OLAP?网络应用程序?
  • 网络应用程序。最终用户应该能够选择时间戳。
  • 那么使用“常规”Web 应用程序有什么问题? RDBMS 确保数据一致性。
【解决方案2】:

您可以使用 FileBeat 之类的软件来读取文件并将 filebeat 输出定向到 RabbitMQ 或 Kafka。从那里,Java 程序可以订阅/使用数据并将其放入 RDBMS 系统中。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2020-01-31
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多