2017-06-20 60 views
0

我有一个基于微服务的应用程序。我有一个接收HTTP请求的Broker/Gateway API。然后我还有两个服务Service A和Service B.当Broker API收到消息时,它使用RabbitMQ将它发送到服务。然后在他们中的每一个中,我都应该处理它,并根据消息以不同的方式处理它(执行不同的操作)。处理微服务请求的设计模式

这是我目前正在处理消息的方式:这是有道理使用switch语句,如果我有不超过5

服务A

public string ProcessAsync(Message message) 
    { 

     switch (message.EventCode) 
     { 
      case "context 1": 
       return action1(); 
      case "context 2": 
       return action2(); 
      case "context 3": 
       return action3(); 
      case "context 4": 
       return action4(); 
      case "context 5": 
       return action5(); 
      default: 
       throw new Exception("Unknown message event code!"); 
     } 
    } 

- 10种不同的消息类型。但在我的应用程序中,我有30个。编写这样一个大条件语句是丑陋的,不同于维护。我正在寻找一种将从应用程序中删除此问题的设计模式。你有什么想法?你怎么看国家模式?

+0

https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism – jaco0646

回答

0

您可以尝试CQRS架构。

在CQRS中,每个命令只有一个处理程序;作为组件,您需要有一个CommandDispatcher,它使用CommandSubscriber将每个命令分配给正确的处理程序。每个命令执行后,会生成一个或多个事件;每个事件也被分派给一个或多个事件处理程序。

如果每条消息具有相同的类别Message,那么您的CommandSubscriber应该基于message.EventCode注册命令处理程序。如果每条消息具有不同的类别(即,Messageinterface),则CommandSubscriber应该基于消息类别来注册命令处理程序。此架构风格尊重Open-close principle,而您的基于交换机的风格则不适用。