我有一个专门用于批处理的Web应用程序(这里有批量服务,api驱动),我有一个专门用于其他一切的主要Web应用程序。我一直在努力决定最好的方法是避免批量服务中的业务逻辑重复。两个应用程序都是群集的。对于简单的作业,批处理的分离是可以的,但是我有更复杂的工作,如果业务逻辑重复,它只会导致混乱。这是我用这个问题的用例。
以下是我一直在考虑的一些解决方案:
其他细节:
所以我的问题是,基于上述细节,可以接受哪些方法来避免重复业务逻辑?可以/应该更改架构以更好地适应这种情况吗?
另一个需要考虑的想法是它的外观和一个"微服务"建筑。这个词在办公室被多次抛出,我们一直在考虑将主要的Web应用程序分解为服务的想法。例如,我们最终可能会提供用户管理服务。
答案 0 :(得分:0)
例如,假设您使用的是Java EE 6应用程序。
您的CSV批量更新程序可能只是一个计时器,每隔一段时间就会读取一个文件夹中转储的CSV文件,并且对该文件上编码的每个用户更新都会将消息泵送到编码您要执行的更新的队列中
在其他地方,您有一个消息驱动Bean,它响应更新请求消息并触发JMS消息上报告的用户的更新业务逻辑。
在成功提交事务之后,如果您有十个不同的应用程序有兴趣知道用户已更新,您可以发布消息,例如,通知主题,例如 - messageType =' userUpdated&#39 ;. 您关心此问题的10个应用程序中的每一个都可以成为该主题的消费者。 他们会被告知用户已更新,并可能在内部发布本地事件(例如CDI事件 - 番石榴事件 - 无论如何 - 内部的satke持有者现在都会这样做。)
通常,每个technlogy堆栈中始终存在Java EE替换。 每个体面的技术堆栈都提供了促进UI和业务逻辑之间松散耦合的方法,正是为了使HTML / WEB被视为应用程序业务逻辑的众多入口点之一。
在scala中,我有一个非常有趣的AKKA框架。
关键是,只要您的业务逻辑没有写在只有Web应用程序可以访问的某个地方,您的罚款就可以了。否则,您已做出设计决策,将业务逻辑与UI结合起来。
答案 1 :(得分:0)
在你的情况下,我建议关注分离,我的意思是一个插件只收集域类,如果使用Grails,其他插件负责服务......这些代表应用程序核心,我如果您的应用程序包含太多的KLOC,那么这种方式会更容易,如果模块之间有很多调用,使用微服务将花费您太多时间。
功能模块之间的通信。插件可以通过事件制作,参见events-si或rabbit MQ插件。