Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 弗林克聚合和解_Amazon Dynamodb_Apache Flink_Flink Streaming_Reconcile - Fatal编程技术网

Amazon dynamodb 弗林克聚合和解

Amazon dynamodb 弗林克聚合和解,amazon-dynamodb,apache-flink,flink-streaming,reconcile,Amazon Dynamodb,Apache Flink,Flink Streaming,Reconcile,DynamoDB中的事务表 Transactions {transaction_id, customer_id, statment_id, transaction_date, transaction_amount} Statements {statement_id, customer_id, start_time, end_time, statement_amount} DynamoDB中的语句表 Transactions {transaction_id, customer_id, stat

DynamoDB中的事务表

Transactions {transaction_id, customer_id, statment_id, transaction_date, transaction_amount}
Statements {statement_id, customer_id, start_time, end_time, statement_amount}
DynamoDB中的语句表

Transactions {transaction_id, customer_id, statment_id, transaction_date, transaction_amount}
Statements {statement_id, customer_id, start_time, end_time, statement_amount}
每天都有数百万笔交易发生。我正在考虑使用Flink,使用DynamoDB streams将交易金额聚合为对账单金额


在任何给定的点上,我都需要知道属于一个报表的所有交易金额是否是聚合的。也就是说,显示对账单金额是否过期。基本上,我说的是和解。如何在Flink中实现这一点?

使用
KeyedProcessFunction
之类的工具,可以很容易地连续更新某些Flink状态,该状态在接收新交易时为每个
对账单id
聚合对账单金额。但据我所知,问题是如何知道聚合何时完成,或者换句话说,Flink何时处理了给定
语句id
的所有事务

流处理应用程序总是面临这个问题。与批处理不同,批处理可以简单地处理所有数据,然后生成结果,而流处理则是一次处理一条记录,不知道将来会发生什么,也不知道会有多大的延迟

这导致我们在延迟和完整性之间进行权衡。一般来说,人们总是可以等待更长的时间,看看有什么额外的数据到达,从而增加了根据(更)完整的信息产生结果的机会。水印是这种权衡的技术表现。任何使用事件时间的流应用程序都必须生成水印,每个水印都用时间戳标记流中的一个点,并声明流在该点上可能在该时间戳之前完成

对于某些应用程序,快速生成可能正确的结果是很好的,事实上,可能比等待更长的时间生成可能更正确的结果要好。但在其他应用中,必须完全准确(不管这意味着什么,准确地说)

确切地说,您应该做什么不是一个技术问题,而是一个业务流程问题。最终,这取决于对账对您的业务意味着什么。也许您应该将目标放在重现当前任何流程的语义上

话虽如此,Flink提供了一组工具,您可以组合使用,以多种方式处理此用例,具体取决于您希望如何工作的细节。以下是各部分如何组合在一起:

每条语句都有一个
结束时间
。当事务流的水印达到了<代码> EndoTime时,这是第一个可以考虑该语句的事务聚合完成的时刻。p> 该水印将(通常)在指定交易流可能无序的量的界限的基础上进行。但是,您必须预料到,无论您多么悲观,一些异常事务都会违反这一假设,并且相对于水印而言会延迟

为了适应这一点,您可以增加水印延迟,以尝试覆盖所有可能的延迟(人们可能会认为,通常情况下,这是不可能的),或者决定在某个时候,您只需继续并生成一个声明,声明要进行对账,但这实际上可能需要在将来进行更新或修改。这种任意迟到的问题是否是一个真正的问题(比如在银行业,一些国际交易可能会经历很长时间的延迟),或者仅仅是理论上的问题,取决于您的实际用例

为了能够适应延迟事务,您需要(1)将语句数据保留在Flink的托管状态,以便添加延迟事务,然后可以使用这些事务更新语句,或者(2)以特殊方式处理延迟事件,从数据库中读取先前生成的结果,然后更新数据库中的记录(这需要以事务方式完成)。方法#2可以在一个单独的作业中实现,该作业使用第一个作业生成的延迟事务流


您可以通过在语句上添加一个时间戳来定义解决此问题的方法,该时间戳指定该语句正好包含在该时间点之前已处理的事务。

谢谢David!你能详细解释一下“报表表的最新更新”是什么意思吗。我如何使用它来计算对账单的对账状态?我已经更新了我的答案,试图更明确地说明我的假设。我完全可能误解了你的要求。大卫,很抱歉给你添麻烦。是的,我的问题略有不同。Flink将用于汇总属于对账单的交易金额。Statements表被配置为一个接收器,用于在Statements表中存储聚合的交易金额。鉴于此,我如何知道Flink已经处理(即聚合)了属于一条语句的所有事务。这更有意义。我已经改写了我的答案。