说到订阅服务通信通常都会想到基于队列的消息生产和消费模式,这也是在实际应该中比较经常使用的方式。通常生产者把消息发送到队列服务中心,而后消费者去中心订阅;然而这种方式须要一个消息服务中心,而在这里所说的订阅服务通信则有点不同,由于须要更灵活的订阅方式,因此须要去除中心化处理;但去除中心化那则须要考虑的事情想对复杂,最基础的环节就是如何维护生产者和消费者的关系,接下来说解如何实现这种方式。 网络
因为在应用中通常会使用队列服务做为消息中心,因此生产者和消费并无直接的关系,一个把消息投递到中心,一个从中心中获取。 架构
去除中心化其实就是生产和消费并不依赖于中心服务,每一个生产和消费自身就是一个中心服务,简单地说也不存在生产和消费划分;每一个服务充当生产的同时也是消费者。 并发
去除中心后服务之间均可以构建订阅体系,即其中一个服务故障也不会影响其余订阅服务,这样在可靠性和灵活性上对于中心化服务都有着很大的优点;但有一个很明显的问题就是没有中心服务,服务之间是如何发现对方呢,这的确是一个麻烦的事情。 spa
对于不一样服务通信须要作的事情是发现对方,通常的服务程序都有固定的地方(域名)和端口来告诉使用者,你能够经过这个地方connect进来。既然须要去除中心化那天然就不会知道如今有什么服务,因此须要制定一套服务自我发现机制来确保服务间能够自动发现。 code
既然咱们不知道对方的服务地址和端口,那怎样发现对方呢?其实每一个服务能够把本身的服务信息经过UDP广播出去,这样其余服务就能够接收到相关的广播,当A接收到其余服务的UDP广播后就会能够知道网内有什么服务,这样就能够向具体的服务发起链接请求,并创建服务与服务之间的通信。 队列
服务和服务之间已经握手了,那消费注册就会变得比较简单,由于消费者随便一台服务上注册均可以同步到同一集群中的全部服务上。 同步
若是消费者在多个服务注册,那总体的通信结构以下 域名
Route.DefaultNode.Open(); mSwitch = new SubscribeSwitch(); mSwitch.GetServiceSubscribe("HELLO").RegisterProcess<Hello>((o, e) => { e.Reply(e.Data); });
Route.DefaultNode.Open(); mSwitch = new SubscribeSwitch(); Hello hello = new Hello { Name = "hello,how are you?" }; hello = mSwitch.Send<Hello>("HELLO", hello);在应用代码中不存全部服务地址的概念,只要节点服务打开就会自动向网内进行服务信息广播,并发现网络的其余服务节点。
因为UDP广播只能有效于局域网段,不适用于广域网,因此些通信架构体系也只适用于应用内部的集群通信体系应用,若是须要应用到广播网,那则须要一个发现中心来确认服务在广域网下是可发现的。 it