我正在研究大量的(异步)数据处理策略,我在这里过于简化了问题-
我创下了一个纪录-
A-event1
B-event1
B-event2
C-event1
C-event2
C-event3
B-event3
A-event2
A-event3
D-event1
D-event2
C-event4
A-event4
A-event4
A-event6
A-eventfinal
B-eventfinal
C-event6
C-event7
C-eventFinal
D-eventFinal
此记录集的转换将是
A-event1 B-event1 C-event1 D-event1
A-event2 B-event2 C-event2 D-event2
A-event3 B-event3 C-event3 D-eventFinal
A-event4 B-eventfinal C-event4
A-eventFinal C-event5
C-event6
C-event7
C-eventFinal
一旦我得到最终的事件数据,那么只有这个集合可以进行进一步的处理。一旦实体到达最终的,它就有资格进行进一步的处理。这个单独的集合现在被发送到第三方应用程序,它得到处理,一旦成功完成,它将返回一个关闭事件或确认,或者可能是失败,因此,这个单独的集合已准备好清除或保留以进行进一步的更正(如果失败),注意,确认或关闭可能要几天才能收到。所以我必须把这些数据保存在某个地方(可能是数据库、Kafka或类似的东西)
这里我用a,bc和d作为实体标识符,可能有上万个(比如guid),我还需要一个重新处理整个记录集的能力。
我阐述的几个选项是
每个标识符都有一个动态的kafka主题,但是任何一点它都可能维护10000个主题,我正在尝试避免db。
设置了一个完整的一个Kafka主题和创建另一个重试主题,类应用程序x保持轮询重试主题。
我对这里的任何数据处理算法都持开放态度,不提数据丢失是不可接受的。
我知道这个解释有点抽象,请让我知道,如果你需要进一步的解释,任何帮助或建议将不胜感激。
我正在寻找一种架构方法。
1条答案
按热度按时间fwzugrvs1#
你的描述有点轻描淡写。但是,您可以通过数据库和某种管道(选择您的毒药)轻松解决此问题
在这个非常人为的例子中,我使用了dataflow,您可以使用任何您喜欢的结构或框架,但是问题仍然是一样的。在这个示例中,dataflow可以毫不费力地完成一些事情。
可以使用异步和等待模式。
以有序的方式处理事物(或不)
可以使用队列进行处理,可以并行处理事情
配置最大并行度
可以创建永久管道
可以取消代币和更多吗
我不得不做了很多假设,留下了很多想象。
您需要考虑容错性
实行取消制度
调整平行度和其他选项
为事件实现一个数据库
如果你的进程失败了,有一个故障恢复和重启机制
例子
输出
注意:这只是一个例子,并不意味着它是一个完整的解决方案或数据流的建议,甚至你应该如何解决它。它只是给你一个结构化管道的概念。