暂无个人介绍
2022年05月
Publisher/Subscriber/Subscription,Processor
网络上多了一跳,性能是有一定损耗的,Broker是中心化设计,类似我们平时全局的Nginx一样,但是Broker的优雅启停显然更加复杂,受限于整个Broker集群的瓶颈等等。
发布服务不需要监听端口,无需Sidecar,服务注册变得简单,无需zk、etcd之类,LoadBalance变得简单,也更安全,没监听端口后很难攻击。
1,IoT的场景;2另外最经典的玩法就是Broker了,Broker类似一种“软路由”的方案,可以让服务的发布访问变得简单。
由两个二进制部分组成:Metadata——元数据,类似HTTP的header;Data——数据,类似HTTP的body
1 帧的设计;2 数据载体——Payload;3 架构;4 玩法;5 关于RSocket Broker
帧(Frame)是RSocket协议报文的最小单位。一个帧由6 bytes的Header和剩余的Body构成
RSocket的效率更高,支持的通讯场景更丰富,也没有队头阻塞的问题。与SocketIO这种基于纯事件的框架相比,RSocket的请求具有很清晰的上下文,API精炼易用。
1二进制协议,紧凑高效。 2多路复用。 3基于帧(Frame)的背压,与ReactiveStreams语义契合。 4灵活的传输层切换: TCP/UDP/WebSocket等
RSocket的Client连接到Server,这个过程称为Setup,在连接成功后,会约定收发消息的方向逻辑:当Client请求Server时,发送的请求ID永远为奇数;当Server请求Client时,发送的请求ID永远为偶数
1即发即忘FireAndForget2请求响应RequestResponse 3流RequestStream4通道RequestChannel
首先,RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用。其次,RSocket是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成。
一是对uaddr进行hash,找到futex_hash_bucket并获取它上面的自旋锁,二是判断*uaddr是否为预期值。如果不相等则会立即返回,由用户态继续trylock。
将当前进程插入到等待队列,就是把futex_q 挂到futex_hash_bucket上2启动定时任务3主动触发内核进程调度。
futex的解决思路是:在无竞争的情况下操作完全在user space进行,不需要系统调用,仅在发生竞争的时候进入内核去完成相应的处理(wait 或者 wake up)。所以说,futex是一种user mode和kernel mode混合的同步机制,需要两种模式合作才能完成,futex变量位于user space,而不是内核对象,futex的代码也分为user mode和kernel mode两部分,无竞争的情况下在user mode,发生竞争时则通过sys_futex系统调用进入kernel mode进行处理。
futex_hash_bucket,futex_key,futex_q。
0,代表当前锁空闲无锁,可以进行快速上锁,不需要进内核。1,代表有线程持有当前锁,如果这时有其它线程需要上锁,就必须标记futex为“锁竞争”,然后通过futex系统调用进内核把当前线程挂起。2,代表锁竞争,有其它线程将要或正在内核的futex系统中排队等待锁。
当调用park时,先尝试能否直接拿到“许可”,即_counter>0时,如果成功,则把_counter设置为0,并返回。2如果不成功,则把线程的状态设置成_thread_in_vm并且_thread_blocked。_thread_in_vm 表示线程当前在JVM中执行,_thread_blocked表示线程当前阻塞了。3拿到mutex之后,再次检查_counter是不是>0,如果是,则把_counter设置为0,unlock mutex并返回4如果_counter还是不大于0,则判断等待的时间是否等于0,然后调用相应的pthread_cond_wait系列函数进行等待,如果等待返回(即有人进行unpark,则pthread_cond_signal来通知),则把_counter设置为0,unlock mutex并返回。
parker内部有个关键字段_counter, 这个counter用来记录所谓的“permit”,当_counter大于0时,意味着有permit,然后就可以把_counter设置为0,就算是获得了permit,可以继续运行后面的代码。如果此时_counter不大于0,则等待这个条件满足。
如果此时state(private volatile int state)是0,那么就表示这个时候没有人占有锁。但因为是公平锁,所以还要判断自己是不是首节点,然后才尝试把状态设置为1,假如成功的话,就成功的占有了锁。2如果此时状态不是0,那么再判断当前线程是不是锁的owner,如果是的话,则state 递增,当state溢出时,会抛错。如果没溢出,则返回true,表示成功获取锁。上述都不满足,则返回false,获取锁失败。