luk*_*bbo 7 architecture domain-driven-design go hexagonal-architecture clean-architecture
我正在 golang 中开发一个程序,该程序是基于六角形架构构建的。我想我的脑子主要围绕着这个想法,但有些东西我就是想不通。
该程序的功能是监控多个IP摄像机的警报事件,接收器可以通过HTTP2.0 PUSH REQUEST接收警报事件的实时流。(以防万一这不是技术术语,我的服务根据 GET 请求建立 TCP/HTTP 连接并保持打开状态,当摄像机触发警报事件时,摄像机将其推送回服务)
架构层次
适配器
港口
服务
领域
用户通过 API 将设备添加到系统,请求包括所需的监控计划(接收器每天应启动和停止的时间)和 url。
调度程序负责定期检查接收器是否应根据其时间表启动。如果它要为某个设备运行,它将启动该设备的接收器。
接收器建立与 IP 摄像机的连接,并循环处理警报事件流并将其传递给EventService。
EventService 接收事件,并负责根据域逻辑处理该事件,并决定发送电子邮件或忽略它。它还将所有事件保存到 eventrepo。
我不确定代码的两部分是调度程序和接收器。他们也应该如此;A。两者在同一个包中并放置在Adapters 层 b.适配器层的接收器和服务层的调度器 c.服务层的调度程序和接收器?
我只是很困惑,因为接收器不是由用户直接启动的,而是由不断检查条件的运行循环启动的。但我也可能为不同品牌的相机配备不同的接收器。这是一个实现细节,这意味着接收者应该位于适配器层。这让我认为选项 b 是最好的。
我可能想得太多了,但请让我知道你们认为最好的选择是什么,或者建议一个更好的选择。
“调度程序负责定期检查接收器是否应根据其时间表启动”
最终,对于应用程序来说,无论是人类定期按下“autoStartReceivers”按钮还是通过调度进程完成,这并不重要。因此,这是一个基础设施问题,调度程序是一个驱动程序适配器。您可能有一个ReceiverService.autoStartReceivers
由调度程序定期调用的服务命令。
现在Receiver
我想说这取决于实施。如果Receiver
不了解基础设施/供应商特定的细节,但只进行协调,那么它可能属于应用程序/服务层。
例如,接收器可能使用抽象EventSource
(HTTP、WebSockets 等)并使用EventDecoder
(特定于供应商的)来适应事件,然后将它们中继到然后EventProcessor
它实际上只是在进行编排。&是适配器EventSource
。EventDecoder
然而,如果Receiver
了解特定的基础设施细节,那么它就成为一个适配器。
最终,以上所有内容都是事件处理核心领域的支持逻辑。核心域逻辑不会真正关心事件是如何捕获的,也可能不会关心结果操作是如何进行的。因此,最简单形式的核心域可能是actions = process(event)
纯函数。
归档时间: |
|
查看次数: |
1881 次 |
最近记录: |