bthread_id
了解bRPC bthread_id。
bthread_id是一个特殊的同步结构,它可以互斥RPC(RPC)过程中的不同环节,也可以O(1)时间内容RPC(控制器)注意,这里我们谈论的是bthread_id_t、bthread_t(bthread tid)、这个名字起的确实不太好,容易混淆。
具体来说,bthread_id解决的问题有:
- 在RPC技术中心响应的代码和发送代码产生竞争。
- 设置计时器后很快触发了,超时处理代码和发送代码产生竞争。
- 重试产生的多个响应同时回来产生的竞争。
- 通过相关id(O(1)时间内找到对应的RPC(RPC)上下文,而无需建立从相关id(RPC)上下文的全局哈希表。
- 取消RPC
上文提到的窃听器框架中广泛存在,下面我们来看下brpc线程id解决这些问题的。
bthread_id包括两部分,一个是用户可见的64μid另一个是对应的不可见的bthread::Id结构体。用户接口都是操作身份映射到结构体的方式和brpc中心其他结构类似:32位是内存池的位移,32英寸版本前者O(1)时间定位,后者防止美国律师协会
bthread_id的接口不太简洁,有不少应用程序编程接口:
这么多接口是为了满足不同的使用流程。
- 发送请求:bthread_id_create->bthread_id_lock->…注册计时器并发送RPC…->bthread _id_unlock
- 接收响应:bthread_id_lock->。。进程响应->bthread_id_unlock_and_destroy
- 异常处理流程:超时/套接字失败->bthread_id_error->on_error投资()、
- 请求重试/备份请求:xi注册计时器并发送RPC->bthread_id_unlock
- 无法重试,最终失败:b线程_解锁_和_存储
- 同步等待RPC c束:bthread_id_join
为了减少等待,bthread_id做了一些优化的机制:
- 错误发生的时候,如果bthread_id已经被锁住,会把错误信息提示一个挂起队列CN,bthread_id_error函数立即返回。当bthread_id_unlock等待队列里面有任务就取出来执行。
- RPC(RPC)结束的时候,如果存在用户回调,先执行一个bthread_id_about_to_destroy,bthread_ id_lock操作立即失败,再执行用户回调(这个可能耗时较长,不可控),最后再执行b线程_解锁_和_存储