任务:需要使用可在多个实例上运行的c#.net创建控制台应用程序。 (出于可扩展性目的)
现在,如果您创建一个直接的应用程序,这很容易。我现在的问题是在我的应用程序上我有一个全局变量。为了让您了解这个应用程序是什么。这是一个接收JSON消息的小程序(我使用RabbitMQ作为消息传递部分)。它接收的消息将存储在全局变量上。现在,这使得在多个实例上运行应用程序变得困难。因为如果您运行的应用程序的实例超过1个,则可能是其他应用程序将收到该消息。这是因为RabbitMQ的Round Robin行为。 (创建Exchange或路由键不是一种选择。)
我尝试过使用共享内存或MemoryMappedFile,但这也不起作用。
我想到的另一件事是使用数据库。但我需要良好的设计才能做到这一点。 如果有人知道模式,示例或任何引用。让我知道。
非常感谢您的回复。
答案 0 :(得分:1)
我会使用MemoryMappedFiles
,它们看起来是最简单的方法(忽略数据库)。
我不确定为什么没有为你做这份工作?
每个应用程序实例都会注册"本身在此文件中并分配用于写入数据的文件部分。 收到消息后,请检查文件中存储的其他实例的数据。
您可以将Mutex用于所有操作(实例注册,写入,读取) - 它将保证您拥有一致的数据图片。
答案 1 :(得分:1)
如果内存映射文件真的不适合您,请稍微更改架构。拥有主控制台应用程序(一种服务器),这可以根据需要产生其他控制台应用程序(某种类型的客户端)。然后,他们可以使用Anonymous Pipes for Local Interprocess Communication(或任何其他进程间通信机制)与服务器核对消息是否已被处理,如果不是,则将其添加到列表或其他任何内容。
答案 2 :(得分:0)
您需要的架构是:
1个控制器。它负责从队列中读取消息并分配它。
1+处理程序。控制器将根据您的负载根据需要实例化一个或多个处理程序。处理程序应该有一个明确的开始/结束。这意味着你执行一个,传入消息,并且一旦正确处理了消息,它就会完全退出。
或者,只需购买Biztalk或类似的消息处理应用服务器。这就是为这些东西而建的。
您主要关心的是可靠性;特别是,知道实际处理了一条消息。因此,您需要一个可以在硬件故障(例如数据库)中存活的存储机制,控制器和处理程序之间的通信机制(可以是任何东西)以及某种方式响应假设长时间运行的进程。可能是一个心脏跳动的片断,以确保其中一个处理程序不仅仅是瘫痪。当然是一种在失败的情况下自动重新处理消息的方法。最后,您需要一种方法来限制处理程序,以便您只能同时运行X号码以防止系统被淹没。
简而言之,这不是一个“简单”的应用程序,除非消息是可以删除,忽略或不处理的消息。