分布式下,通常有多个角色进行互相协调。因此作为一个分布式角色来说,首先要解决的就是如何和其他分布式角色进行通信。
对于客户端而言,首先需要明确集群的信息,以及如何进行连接,因此也涉及到具体使用到的IO模型是什么?
如下是kafka producer发送一条消息需要进行的操作:
1、拉取集群元数据
2、底层利用NIO建立sokcet连接进行向指定节点进行发送信息。
作为服务端来说,更关心的是如何更好的接收和管理众多的连接,以及对连接的请求响应的匹配是如何做到的?
一般来说,作为服务端,会有一个boss线程负责accept请求,然后抛给后续的若干个worker工作线程去处理内容,但这都属于IO线程的部分,一般实际的计算处理逻辑都要再另外抛给业务线程进行处理。
请求队列但这个过程中可能存在请求过多,业务线程来不及处理,此时一般会使用一个队列进行解耦预先把worker线程解包好的请求内容进行堆积。
业务线程使用单线程还是多线程?取决于业务的要求:
如果要求保证单个socket多次请求的顺序性,那么有2种方式: 1、发送方维护,串行发送消息,必然保证有序性,此时业务线程可以是多线程的。2、发送方不维护,异步发送消息,此时业务线程必然需要是单线程的。
如果不要求保证顺序性,那么可以使用多线程,典型的例子就是如果作为一个web服务,每个请求互相之间是不需要顺序保障的,那么业务线程采用多线程即可
同样的,一个请求有来就要有响应,但这个过程中可能存在响应过多,worker线程来不及处理,此时一般会使用若干个响应队列进行解耦预先把响应内容进行堆积,为了降低复杂度,一般响应队列可以是与worker线程有一定的绑定关系的,为了方便后续的响应找到对应的请求socket进行返回。



