2

任务:需要使用 c#.net 创建一个可以在多个实例上运行的控制台应用程序。(出于可扩展性目的)

现在,如果您创建一个简单的应用程序,这很容易。我现在的问题是在我的应用程序上我有一个全局变量。让您了解这个应用程序是什么。这是一个接收 JSON 消息的小程序(我使用 RabbitMQ 作为消息传递部分)。然后它将接收到的消息存储在全局变量中。现在,这使得在多个实例上运行应用程序变得困难。因为如果您运行超过 1 个应用程序实例,则可能会在另一个应用程序上收到消息。这是因为 RabbitMQ 的循环行为。(创建 Exchange 或路由密钥不是一种选择。)

我尝试过使用共享内存或 MemoryMappedFile,但这也不起作用。

我想到的另一件事是使用数据库。但我需要好的设计来做到这一点。如果有人知道一种模式、一个例子或任何参考资料。让我知道。

非常感谢您的回复。

4

3 回答 3

1

我会使用MemoryMappedFiles,它们看起来是最简单的方法(忽略数据库)。我不知道为什么没有为你做这项工作?

应用程序的每个实例都将在此文件中“注册”自身并分配要在其中写入数据的文件部分。当您收到消息时,请检查文件中存储的其他实例的数据。

您可以将 Mutex 用于所有操作(实例寄存器、写入、读取)——它将保证您拥有一致的数据图片。

于 2012-11-12T20:33:04.877 回答
1

如果内存映射文件真的不适合你,那么稍微改变一下架构怎么样。拥有主控制台应用程序(某种服务器),这可以根据需要生成其他控制台应用程序(某种客户端)。然后,他们可以使用匿名管道进行本地进程间通信(或任何其他进程间通信机制)来与服务器检查消息是否已被处理,如果没有,则将其添加到列表中或其他任何内容。

于 2012-11-12T20:41:00.613 回答
0

您需要的架构是:

1 控制器。这负责从队列中读取消息并分配它。

1+ 处理程序。控制器将根据您的负载实例化一个或多个处理程序。处理程序应该有一个明确的开始/结束。这意味着您执行一个,将消息传递进来,一旦该消息被正确处理,它就会完全退出。


或者,只是去购买 Biztalk 或类似的消息处理应用服务器。这就是这些东西的目的。

您主要关心的是可靠性。具体来说,知道一条消息实际上已被处理。因此,您需要一种能够在硬件故障(例如数据库)中幸存下来的存储机制、控制器和处理程序(可以是任何东西)之间的通信机制以及假设长时间运行的进程的某种响应方式。可能是一个心跳片,以确保其中一个处理程序没有刚刚倒下。当然是一种重新处理消息的方法,也许是自动的,以防失败。最后,您需要一种方法来限制处理程序,以便您只同时运行 X 个数,以防止系统不堪重负。

简而言之,这不是一个“简单”的应用程序,除非消息可以被删除、忽略或以其他方式不处理。

于 2012-11-12T20:48:24.887 回答