在上一篇文章里我们主要介绍了 tomcat NIO 的整体架构,以及在这个架构下的各个线程,在这里我们主要介绍 acceptor 线程。...startAcceptorThread() { acceptor = new Acceptor(this); String threadName = getName() + "-Acceptor..."; acceptor.setThreadName(threadName); Thread t = new Thread(acceptor, threadName); t.setPriority...(getAcceptorThreadPriority()); t.setDaemon(getDaemon()); t.start(); } acceptor 线程的核心工作类为 Acceptor...该方法设置 acceptor 线程的优先级和守护线程属性,并启动线程。
文章目录 Socket Acceptor Socket #pragma once #include "nocopyable.hpp" class InetAddress; //封装sockfd...socklen_t>(sizeof optval)); if (ret < 0 && on){ LOG_FATAL("SO_REUSEPORT failed."); } } Acceptor...} else{ ::close(connfd); } } else{ LOG_ERROR("in Acceptor
Acceptor用于accept(2)接受TCP连接 Acceptor的数据成员包括acceptSocket_、acceptChannel_,Acceptor的acceptSocket_是listening... acceptor(&loop, listenAddr); acceptor.setNewConnectionCallback(newConnection); acceptor.listen...的成员 boost::scoped_ptr acceptor_; // avoid revealing Acceptor TcpServer还包含了一个TcpConnection...在TcpServer 构造函数中先初始化acceptor_成员,acceptor_(new Acceptor(loop, listenAddr)),在构造函数体内: // Acceptor::handleRead...其实是被acceptor的 idleFd_ 占据了。
. --> Scaled older deployment router-3 down --> Scaling router-4 to 1 error: update acceptor rejected
Proposer对于每一个产生的[Mn,Vn]的提案,需要满足一下条件:存在一个超过半数的的Acceptor组成的集合S: 要么集合S中没有Acceptor批准过编号比Mn小的提案 要么集合S中所有Acceptor...: 向Proposer保证不再批准任何编号小于Mn的提案 如果Acceptor已经批准过提案,那么就向Proposer返回当前Acceptor已经批准过得编号最大且小于Mn的提案的值。...Proposer选择一个提案编号为Mn,然后向大多数的Acceptor发送编号为Mn的Prepare请求 如果一个Acceptor收到一个编号为Mn的Prepare请求,且编号Mn大于该Acceptor...阶段二:Acceptor批准提案 如果Proposer收到超过半数的Acceptor的响应,那么就会发送一个[Mn, Vn]提案的accept请求给Acceptor,Vn的值就是阶段一种收到的响应中编号最大的提案的值...Acceptor批准的提案,通信的次数至少是Learner数量和Acceptor数量的乘积 方案二 Acceptor批准提案后向一个主Learner发送该提案,然后由该主Learner通知其他的Learner
就是Acceptor接受的提议值喽,他们的初始值都为null。...而后两个请求发生了网络延迟,一直未到达相应的Acceptor。 ...发送的accept请求发生了延迟,所以Acceptor3返回的是;而Acceptor5的操作和我们在文章第一张图中的Acceptor1的操作相同,他们都是第一次接收到prepare请求。 ...然后Acceptor1,Acceptor3,Acceptor5三个Acceptor接受了这个accept请求,更新自己的。...paxos7.png 那么Proposer1对Acceptor3发送的accept请求在此时达到Acceptor3会怎么样呢?
推导过程1)发布提案最容易选定一个值的方法是只允许有一个 acceptor 代理 , 但是如果这个acceptor 出错 ,接下来的工作无法进行。...从 P1 和“当且仅当大多数 acceptor 接受了某个值,这个值才是最终被选定的”这两个条件可以推出,必须允许 acceptor 接受多个提案。...因为:如果被选定的提案编号为 m,那么必然有一个包含大多数 acceptor 的集合 C,C 中的每个 acceptor 都接受了它。...acceptor 可以回复任何 prepare 请求;但是仅当 acceptor 接受某个提案,才可以回复对应的 accept 请求。也就是说:P1a....阶段 2(a)如果某个 proposer 收到大多数 acceptor 对于它编号为 n 的 prepare 请求的回复,那么它会发送一个 accept 请求给这些 acceptor。
= Executors.newFixedThreadPool(1500);//建立线程池 //加入过滤器(Filter)到Acceptor acceptor.getFilterChain...acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用 acceptor.getSessionConfig...); //设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝 acceptor.setBacklog(100); acceptor.setDefaultLocalAddress...(new InetSocketAddress(port)); //加入处理器(Handler)到Acceptor acceptor.setHandler(new WebHandler...()); acceptor.bind(); } NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。
,Proposer-2,Proposer-3他们的编号是20,10,30,为了举例好理解,我们的Proposer-1向Acceptor-1,Acceptor-2发送消息,Proposer-2向Acceptor...-2,Acceptor-3发送消息,Proposer-3向Acceptor-2,Acceptor-3发送消息。...Proposer-3的prepare(30)请求消息到达Acceptor-2和Acceptor-3,他们都接受过请求,但是编号30的消息大于Acceptor-2和Acceptor-3,他们都可以接受该prepare...-2和Acceptor-3提交了Proposal(server3-id,30,server3) Acceptor的表决 Acceptor-1和Acceptor-2接受到Proposer-1的提案Proposal...Acceptor-2和Acceptor-3接受到Proposer-3的提案Proposal(server3-id,30,server3),他们拒绝了该提案 最后,由于Acceptor-2和Acceptor
Acceptor:批准者。...假设Proposer 1 的提案先达到了 Acceptor 1 和 Acceptor 2,而Proposer 2 的提案先达到了 Acceptor 3,其达到 Acceptor 1 和 Acceptor...Proposer 1 发现超过半数的Acceptor都接受了自己,所以放心大胆地发起要求,让所有Acceptor都按照自己的值来操作。...这里再想多一点,考虑另一种场景:假设Proposer 2 的Accept请求先达到了Acceptor 2,然后Proposer 1 向Acceptor 2 发送的Prepare请求才到达 Acceptor...最直观的处理是, Acceptor 2 直接拒绝,然后Proposer 1 走上面的流程,但Paxos为了效率,又增加了另一条规则: 如果一个Prepare请求,到达Acceptor时,发现该Acceptor
Proposer:只要Proposer发的提案被Acceptor接受(刚开始先认为只需要一个Acceptor接受即可,在推导过程中会发现需要半数以上的Acceptor同意才行),Proposer就认为该提案里的...Acceptor:只要Acceptor接受了某个提案,Acceptor就认为该提案里的value被选定了。...但是,如果这个唯一的Acceptor宕机了,那么整个系统就无法工作了! 因此,一个Acceptor是不可行的,必须要有多个Acceptor!...多个Acceptor 当有多个Acceptor的时候,如何保证在多个Proposer和多个Acceptor的情况下选定一个value呢? 大家可以自己先进行思考。...(注意:此时接受Accept请求的Acceptor集合不一定是之前响应Prepare请求的Acceptor集合) Acceptor接受提案 Acceptor可以忽略任何请求(包括Prepare请求和Accept
),为实现P2,实质上acceptor需要做到: **P2a**....假设有A~E 5个acceptor,- 表示acceptor因宕机等原因缺席当次决议,x 表示acceptor不接受提议,o 表示接受提议;多数派acceptor接受提议后提议被确定,以上表格对应的决议过程如下...(ß): 如果决议B被acceptor多数派接受,则确定决议B B3(ß): 对于ß中的任意提议B(n,v),acceptor的多数派中如果存在acceptor最近一次(即ID值最大)接受的提议的值为v...最后我们再引入一个新的角色:learner,learner依附于acceptor,用于习得已确定的决议。以上决议过程都只要求acceptor多数派参与,而我们希望尽量所有acceptor的状态一致。...如果部分acceptor因宕机等原因未知晓已确定决议,宕机恢复后可经本机learner采用pull的方式从其他acceptor习得。
Acceptor 批准者 在集群中,Acceptor 有 N 个,Acceptor 之间完全对等独立,Proposer 提出的 value 必须获得超过半数(N/2+1)的 Acceptor 批准后才能通过...这里Leaner的流程就参考了Quorum议会机制,某个value需要获得W=N/2+1的Acceptor批准,Learner需要至少读取N/2+1个Accpetor,最多读取 N 个 Acceptor...Proposer 与 Acceptor 之间的交互 Proposer与Acceptor之间的交互 Paxos 中,proposer提交给Acceptor,由Acceptor达成一致选取最终的value,...在Paxos流程中,如果出现半数以内的Acceptor失效,可以分为两种情况: 第一种,如果半数以内的Acceptor失效时还没确定最终的value,此时所有的Proposer会重新竞争提案,最终有一个提案会成功提交...Acceptor需要接受更大的N,也就是ProposalID有什么意义?
AbstractServerThread类 这是Acceptor线程和Processor线程的抽象基类 Acceptor线程类 接收和创建外部TCP连接的线程。...Acceptor线程 经典Reactor模式的Dispatcher接收外部请求并分发给下面的实际处理线程。在Kafka中,这个Dispatcher就是Acceptor线程。...Acceptor线程在初始化时,需要创建对应的网络Processor线程池。Processor线程是在Acceptor线程中管理和维护的。...于是Acceptor类就具备Processor线程池管理功能。 Acceptor类的run方法 - 处理Reactor模式中分发 ?...Acceptor线程会先为每个入站请求确定要处理它的Processor线程 Acceptor线程使用Java NIO的Selector、SocketChannel循环轮询就绪的I/O事件(SelectionKey.OP_ACCEPT
在 [slide-27] 中我们介绍了1个 Acceptor 所需的字段: 在存储端(Acceptor)也有几个概念: last_rnd 是Acceptor记住的最后一次进行写前读取的Proposer...(r.Id) defer v.mu.Unlock() reply := v.acceptor if r.Bal.GE(v.acceptor.LastBal) { v.acceptor.LastBal...&*v.acceptor.LastBal, } if r.Bal.GE(v.acceptor.LastBal) { v.acceptor.LastBal = r.Bal v.acceptor.Val...这个函数接受2个参数: 所有Acceptor的列表(用一个整数的id表示一个Acceptor), 以及要提交的值....在论文中的描述是Acceptor接受一个值时(vote), 也要把这个事情通知其他 Learner角色, 我们可以给每个Acceptor也设定成Learner: Acceptor vote一个值时除了应答
相较于KafkaRequestHandler,Acceptor和Processor最多算请求和响应的“搬运工”。...SocketServer AbstractServerThread类 这是Acceptor线程和Processor线程的抽象基类 Acceptor线程类 接收和创建外部TCP连接的线程。...Acceptor线程 经典Reactor模式的Dispatcher接收外部请求并分发给下面的实际处理线程。在Kafka中,这个Dispatcher就是Acceptor线程。...Acceptor线程在初始化时,需要创建对应的网络Processor线程池。Processor线程是在Acceptor线程中管理和维护的。...Acceptor类的run方法 - 处理Reactor模式中分发 Acceptor线程会先为每个入站请求确定要处理它的Processor线程 Acceptor线程使用Java NIO的Selector
方案一 假设系统由单个 Acceptor 组成。...但我觉得在单个 Acceptor 中这不是问题,只要任何时候都遵循 Acceptor 的 var 被设置了不能再被修改即可。...该方案存在的问题:单个 Acceptor 宕机会导致系统无法提供服务。 方案三 在方案二基础上引入多个 Acceptor。 这里假设 Acceptor 集群数量固定。...过半 Acceptor 的 var 被设置成同一值;那么对于单个 Acceptor 来说,就要求能多次 accept 值。...Proposer 在 prepare 阶段发现某些 Acceptor 有值,是否可以直接释放锁?不一定,因为现在有多个 Acceptor ,且过半的 Acceptor 认定同一个值才算结束。
Acceptor:批准者。Acceptor 有 N 个,Proposer 提出的 value 必须获得超过半数(N/2+1)的 Acceptor 批准后才能通过。Acceptor 之间完全对等独立。...1、初始状态 Acceptor 1 Acceptor 2 Acceptor 3 Acceptor 4 Acceptor 5 B 0 0 0 0 0 V NULL NULL NULL NULL NULL...Proposer1 b 1 2、Proposer 向所有 Accpetor 发送“Prepare(1)”,所有 Acceptor 正确处理,并回复 Promise(1, NULL) Acceptor...1 Acceptor 2 Acceptor 3 Acceptor 4 Acceptor 5 B 1 1 1 1 1 V NULL NULL NULL NULL NULL Proposer1 b 1...Acceptor 1 Acceptor 2 Acceptor 3 Acceptor 4 Acceptor 5 B 1 1 1 1 1 V v1 v1 v1 v1 v1 4、此时,v1 被超过半数的 Acceptor
如一共有2F+1位Acceptor,则Quorum人数为F+1位。 Proposer、Acceptor、Learner只是角色的分工,在具体实现中,一个进程可能担当不止一种角色。...,同时该Acceptor承诺不再接受任何编号小于N的提案。...阶段二 如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。...如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案。...P1a:当且仅当acceptor没有回应过编号大于n的prepare请求时,acceptor接受(accept)编号为n的提案。
Acceptor (Voters) Acceptor 可以看做是消息请求的存储器。...当一个Acceptor收到从Proposer发过来的Prepare消息时候,会有两种情况: 该消息中的n是Acceptor所有收到的Prepare消息中最大的一个,那么该Acceptor必须返回一个Promise...Acceptor确认。...当(n,z)消息被Acceptor确认时,Acceptor会发送一个Accepted(n,z)消息给Proposer 和所有的Learner。...我们举个例子: Acceptor 收到Accept(n,z),然后返回了Accepted(n,z),接下来该Acceptor 又收到了Prepare(n+1)请求,按照阶段1B的原则,Acceptor会
领取专属 10元无门槛券
手把手带您无忧上云