使用 RabbitMQ 或任何消息代理来通信 OPC 客户端和微服务控制器

问题描述

我们有一个具有 OPC 服务器的系统的以下场景,我们构建了 OPC 客户端以与之交互,另一方面,我们有一个微服务器(控制器),我们希望与 OPC 客户端通信以控制系统。让微服务控制器与 OPC 客户端通信的最佳方式是什么? RabbitMQ 或任何其他代理是一种选择吗?

我正在尝试完成的非常高级的图表如下图所示:

enter image description here

解决方法

当您说您希望微服务控制器与 OPC 客户端“通信”时,这是什么意思?

你看,如果你有一个 OPC 客户端,你就可以:

  • 订阅 OPC 服务器中的标签并获取数据更改。
  • 从 OPC 服务器中的 1 个或多个标签中读取特定值。
  • 将特定值写入 OPC 服务器中的 1 个或更多标签。

通常,您会将所有业务逻辑放在 OPC 客户端中并完成。但是,如果您将微服务添加到组合中,那么您的 OPC 客户端将成为另一个代理。请记住,OPC 服务器已经是网络上实际设备的代理。

您是否希望微服务:

  • 接收所有数据更改的更新?
  • 或者您是否希望能够在微服务中“写入”和“读取”特定标签?
  • 或两者兼而有之!

将数据更新推送到微服务

如果您只想让微服务接收订阅标签的所有更改的“数据更新”,那么 Rabbit MQ 非常适合。它快速且可扩展。如果微服务出现故障,则消息会一直保留,直到它恢复为止,这样您就不会丢失任何数据。 Rabbit MQ 稳健可靠。

要将消息推送到队列中,您需要更新 OPC 客户端的代码以将消息发送到 RabbitMQ 队列。您可以通过官方的 c# nuget 包执行此操作,甚至可以使用简单的 HTTP 帖子将消息添加到队列中(因此您可以使用 C# HttpClient 类发送消息)。

从微服务读取/写入特定标签的数据

如果您想从微服务读取和写入特定标签,那就不同了。请注意上面的“数据更新”,无论是否有任何内容正在侦听,OPC 客户端都必须推送到兔子队列。

但是,如果您希望能够从微服务读取或写入特定标签,那么您将需要类似 Web 界面(或共享数据库表)之类的东西 OPC 客户端可以监控。这样,微服务就可以调用 Web 界面将特定值写入标签或从特定标签读取并获取结果。