当前位置: 首页 > 面试题库 >

使用DDD,一个人如何实现批处理?

袁旻
2023-03-14
问题内容

我有逻辑,包括从一个系统中选择大量记录,执行多个转换(基于业务规则)并将它们插入到另一个系统中。

将这些记录中的每一个实例化为一个对象,对它们执行转换,然后将所有这些对象插入另一个系统,似乎是一种高性能(和内存)。

在DDD中实现此目标的最佳方法是跳过类/对象并直接通过SQL(也许是存储过程)来做到这一点吗?

有没有更好的方法使用DDD来实现此目标?

注意:系统使用SQL数据库,目前不能选择像CouchDB这样的对象存储。


问题答案:

许多在DDD上构建的分布式系统都使用事件驱动的体系结构,在这种情况下,当每个实体经历状态改变(会导致其由您的系统进行转换)时,与其等待一批执行所有转换,不如等待被发布到某种消息总线上的事件(例如,用于Java的Mule,用于.NET的MassTransit)。您的转换系统将预订此事件,并且随着每条消息到达系统中,它将对消息中标识的实体执行转换,然后将另一条消息发布到目标系统。

这种“滴答处理”可以连续运行一整天,而不会给系统带来任何负担,而这将使工作在下班后运行。如果您担心性能,这种架构可能会导致系统的最后记录转换为COB后5分钟,其中批处理作业甚至可能要到凌晨3点才能运行(在所有其他批处理作业都已完成之后)完成的)。

如果您确实不希望在午夜之前更新目标系统,例如,只需将消息排队直到午夜,然后将其发布到目标系统的端点即可。

格雷格·杨(Greg Young)博客并广泛介绍了这种架构。查看他在InfoQ上的工作。



 类似资料:
  • 在ddd中,实体可以引用同一聚合的实体或另一聚合根(但不能引用另一聚合内的实体)。 如何实施这样的参考? 实体的方法如何访问引用的聚合根? 实体允许对另一个聚合根做的方法是什么? 对于1.和2.,我的问题是,实体不应该访问存储库。此外,神奇的延迟加载机制并不总是可用的,我认为出于同样的原因应该避免。因此,当存储库加载聚合时,存储库是否应该解析其中每个实体的所有引用(以及所有引用的其他聚合)?或者“

  • 我已经为TextInput创建了公共类,并多次使用它,但它的事件处理方法相同。我想在TextInput中填充数据后处理数组数据。 这里添加了多个textField和单个。如何标识哪个textInput调用了。 根据数组数据动态添加的textField组件。现在,当用户编辑textInput时,我希望在特定索引上标识textInput和更新的数组文本。

  • 到目前为止,我正在运行spring批处理,只有一个作业。现在我想运行多个不同的作业,这意味着不同的功能。在我的配置文件中,我配置了两个具有不同id和不同名称的作业。现在我得负责这些工作。你能告诉我怎么跑吗。在这里,我的疑问是在我的java类中,我已经为运行批处理编写了这段代码。 对于其他作业,如何调用jobLauncher的run方法。 我的配置文件是

  • 我正在尝试将我的应用程序从flink流处理转换为flink批处理。 对于flink数据流,我从包含多个JSON对象的预定义文件中读取字符串,并执行从JSON对象到tuple3收集器的flatmap(第一个元素--来自JSON对象的一个字段,第二个元素--来自JSON对象的另一个字段,第三个元素--实际的JSON对象数据)。 然后,在窗口中执行元组的first和element的keyBy。 对于fl

  • 我正在尝试更改现有的spring批处理作业(XML配置),它从oracle数据库读取数据,并以所需格式写入txt和XML文件,但现在我想更改相同的实现,从Cassandra数据库而不是oracle读取数据,但我在spring批处理中找不到类似于JdbcCursorItemReader的项目读取器。 有人能告诉我应该使用哪个ItemReader从Cassandra DB读取数据吗?或者我需要创建一个

  • 1、使用 @ExceptionHandler 注解处理局部异常(只能处理当前controller中的ArithmeticException和NullPointerException异常,缺点就是只能处理单个controller的异常) @Controller public class ExceptionHandlerController { @RequestMapping("/excep")