72bf13a395
* add ubring transport * fix the bug for ub ring transport * fix the bug for ub ring transport and other * add the license for ub transport * Modifying the variable naming style * optimize the log message and some field name * fix some bug for ubring * add some log ubring endpoint * add todo * fix the bug for handshake for ub endpoint * fix the bug for client ub endpoint * optimize the iobuf file code * modify the log level * fix the declare_shm_ubs define not found bug * add the timer_mgr support for macos and format code style * fix the bug for macos epoll * fix the timespece bug * adaptor the itimerspec for macos platform * optimize the cmakelist config * add the ubring docs for ubring transport * modify some file name and directory structure * modify some code style and optimize code logical * add the cmake ubshm transport ci/testing * add the dependency header * bug fix the code * Fix UB shm allocation cleanup crashes (#11) Co-authored-by: 郭业昌 <lvpengfei@MacBook-Air.local> * remove the brpc_ubshm_unittest * Found and fixed two stability issues (#13) * 修复ubring server端关闭连接coredump问题 * 修复PollIn/PollOut解引用已释放Socket指针的问题 PollIn/PollOut通过ep->_socket(裸指针)读取data socket,当data socket 被销毁时该指针悬空,导致Socket::Address读到垃圾id触发SIGSEGV。 改为存储_socket_id(SocketId),用Address获取引用计数的Socket, 并在整个回调期间持有该引用,避免解引用悬空指针。 * 修复client非正常退出导致UBRING shm残留的问题 client被强杀(SIGTERM/崩溃/OOM)时teardown没跑完,localShm(_C)的 shm_unlink未执行,导致/dev/shm残留_C文件。server的remoteShm只munmap 不unlink(正确),无法清理client的名字。 在握手ESTABLISHED时(client/server都确认对方已mmap自己的localShm) 立即unlink localShm名字。此时对端已持有mmap引用,unlink只删名字不 影响通信;进程任意时刻退出都不会残留文件名。 * Address chenBright's review: use English comments and BAIDU_CACHELINE_ALIGNMENT - Convert all Chinese comments in ubshm to English (per chenBright's 'Please use English' on ub_endpoint.cpp:723, ub_ring.cpp:337, shm_ubs.cpp:316, and similar) - Replace __attribute__((aligned(64))) with BAIDU_CACHELINE_ALIGNMENT in ubr_msg.h (per chenBright's comment on ubr_msg.h:41) - Remove unnecessary TODO comment in ub_ring.cpp:551 (per chenBright's 'Unnecessary comments, please delete') * Remove unused lock macros in thread_lock.h Per chenBright's review, the functions and macros defined in thread_lock.h are largely unused. Verified usage across ubshm: - LOCK_GUARD / UnlockMutex: 8 call sites in shm_ubs.cpp and ub_ring_manager.cpp, kept. - SPIN_LOCK_GUARD, R_LOCK_GUARD, W_LOCK_GUARD, SEMAPHORE_WAIT_GUARD, SEMAPHORE_WAIT_GUARD_WITH_CLOSE and their helper functions (UnlockSpinLock, UnlockRWLock, PostSem, PostSemWithClose): 0 call sites, removed. * Apply chenBright's review on timer_mgr globals Per chenBright's review on timer_mgr.cpp:32-37: - Add explicit default values to uninitialized globals (g_total_timer_num=0, g_max_system_fd=0, g_epoll_execute_thread=0, g_timer_module_initialized=0) - Rename globals to snake_case (g_epollFd -> g_epoll_fd, g_totalTimerNum -> g_total_timer_num, g_timerFdCtxMap -> g_timer_fd_ctx_map, maxSystemFd -> g_max_system_fd, g_epollExecuteThread -> g_epoll_execute_thread, g_timerModuleInitialized -> g_timer_module_initialized) - maxSystemFd also gains the g_ prefix to match global naming style Also fix the missing std:: qualifier on atomic_fetch_sub/add/load (per chenBright's earlier comment on timer_mgr.cpp:80). * Change CloseTimerFd fd type from uint32_t to int Per chenBright's review on timer_mgr.cpp:399 (uint32_t -> int). fd is a system file descriptor; POSIX APIs use int and -1 denotes an invalid fd, which uint32_t cannot represent. Changed the CloseTimerFd signature (header + definition) and removed the now-unnecessary (uint32_t) casts at the two call sites. * Use BAIDU_LIKELY/BAIDU_UNLIKELY instead of custom __builtin_expect Per chenBright's review on common.h:27. Rather than redefine the macros with __builtin_expect directly, forward LIKELY/UNLIKELY to brpc's standard BAIDU_LIKELY/BAIDU_UNLIKELY (from butil/compiler_specific.h). The 122 call sites keep using LIKELY()/UNLIKELY() unchanged; only the macro bodies change, preserving semantics. * Add unit tests for UBShmEndpoint Per chenBright's request to add unit tests for UBShmTransport in this PR (rather than a follow-up). Adds test/brpc_ubring_unittest.cpp with tests covering the public interface of UBShmEndpoint under the g_skip_ub_init=true mode (which skips real shared-memory/poller setup): - construct_and_destruct: lifecycle safety - is_writable_false_when_skip_init: skip-mode behavior - reset_is_idempotent: Reset() is safe to call repeatedly The file follows the brpc_*_unittest.cpp naming convention so it is auto-collected by test/CMakeLists.txt's file(GLOB). Verified: compiles, links, and all 3 tests pass (g++ 15.2, C++17, gtest, BRPC_WITH_UBRING=ON). * Rewrite UBShmEndpoint unit tests with real coverage Per chenBright's feedback that the previous tests were too simple and did not cover the main methods. Source changes to enable testing: - Move HelloMessage struct declaration from ub_endpoint.cpp to ub_endpoint.h so tests can access it - Expose private members under #ifdef UNIT_TEST (precedent: butil/containers/stack_container.h) so tests can call AllocateClientResources without -Dprivate=public (which breaks GCC 15 + new libstdc++ <any>/<sstream>) Tests (9, all passing on Ubuntu 26.04 g++ 15.2 C++17 gtest): HelloMessageTest (5): serialize/deserialize roundtrip, network byte order verification, uint64 max boundary, full shm_name, toString UBShmEndpointTest (4): construct, real IPC shm AllocateClientResources (g_skip_ub_init=false), reset cleanup, reset idempotency * rename the variable to snake_case style --------- Co-authored-by: YeChang Guo <52730608+YChange01@users.noreply.github.com> Co-authored-by: 郭业昌 <lvpengfei@MacBook-Air.local> Co-authored-by: gure <740684863@qq.com>
7.0 KiB
7.0 KiB
bRPC是用C++语言编写的工业级RPC框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。
"bRPC"的含义是"better RPC"
你可以使用它:
- 搭建能在一个端口支持多协议的服务, 或访问各种服务
- restful http/https, h2/gRPC。使用bRPC的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议.
- redis和memcached, 线程安全,比官方client更方便。
- rtmp/flv/hls, 可用于搭建流媒体服务.
- hadoop_rpc(可能开源)
- 支持rdma
- 支持thrift , 线程安全,比官方client更方便
- 各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议.
- 基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源。
- Server能同步或异步处理请求。
- Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。
- 通过http界面调试服务, 使用cpu, heap, contention profilers.
- 获得更好的延时和吞吐.
- 把你组织中使用的协议快速地加入bRPC,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)
试一下!
- 通过概述了解哪里可以用bRPC及其优势。
- 阅读编译步骤了解如何开始使用, 之后可以运行一下示例程序.
- 文档:
- 性能测试
- bvar
- bthread
- Client
- Server
- 内置服务
- 工具
- 其他
- IOBuf
- Streaming Log
- FlatMap
- 协程
- 熔断
- UBRing
- RDMA
- Bazel构建支持
- Wireshark baidu_std协议解析插件
- bRPC外功修炼宝典(培训材料)
- 搭建大型服务入门(培训材料)
- bRPC内功修炼宝典(培训材料)
- 深入RPC
- Use cases inside Baidu
贡献代码
请参考这里。
反馈和参与
- bug、疑惑、修改建议都欢迎提在Github Issues中
- 订阅邮件列表(dev-subscribe@brpc.apache.org)获得项目最新信息
行为准则
我们遵守Apache软件基金会的行为准则, 请参考如下 链接

