我有一个专门用于批处理的 Web 应用程序(这里是批处理服务,API 驱动),我有一个专门用于其他所有事情的主 Web 应用程序。我一直在努力决定最好的方法是避免批处理服务中业务逻辑的重复。两个应用程序都是集群的。批处理的分离对于简单的工作来说是可以的,但我有更复杂的工作,如果业务逻辑被复制,它只会导致混乱。这是我出于这个问题的目的的用例。
- 客户为用户更新安排一个 cron 作业。
- 批处理服务提供一个包含 20,000 条用户记录的 CSV 文件。
- 批处理服务通过文件对记录执行验证,基本上是试运行。
- 批处理服务将检查允许的更改和错误阈值(百分比为计数)
- 如果验证阈值通过,批处理服务将开始创建/更新用户。
- 创建或更新用户时,有许多模块/功能需要了解这些事件。
- 跟踪工作进度,客户可以查看进度、日志和工作状态。
以下是我一直在考虑的一些解决方案:
- 合并业务逻辑并在两个应用程序之间共享。这不一定很容易,因为主应用程序是一个 Grails 应用程序,而且它到处都是 GORM。
- 让批处理服务命中主应用程序上的 API,以进行创建和更新以及可能更复杂的验证场景。担心这会对 tomcat 造成影响,但调用将通过负载均衡器进行分配。
- 让批处理服务在主应用程序上命中 API 以进行验证,然后将创建/更新请求排队并让主应用程序检索它们。同上,队列有助于减少 http 调用。还需要一个队列来将状态报告回批处理服务。
- 通过让批处理服务进行自己的验证和插入/更新来复制一些逻辑,然后触发用户创建的事件或用户更新的事件,以便主应用程序中的模块/功能可以处理这些更改。
- 将批处理服务嵌入到主应用程序中
其他详情:
- 批处理服务和 Web 应用程序都是集群的
- 两者都在 AWS 上运行,因此我可以轻松访问 SQS 和 SNS 等工具
- Java 1.7 应用程序
- Tomcat 容器
- 主要应用是 Grails
- 批处理服务以 Spring Batch 和 Quartz 为核心
所以我的问题是,根据上述细节,避免业务逻辑重复的可接受方法是什么?可以/应该改变架构以更好地适应这一点吗?
另一个需要考虑的想法是这会是什么样子以及“微服务”架构。这个词在办公室里被反复讨论过很多次,我们一直在考虑将主要的 Web 应用程序分解为服务的想法。例如,我们最终可能会提供用户管理服务。