一句话定义: z_ipc 是 zAPI 跨语言 RPC 框架 的进程通信(IPC)组件,让同一台机器上不同进程、不同语言之间,能像在同一个进程里传数据一样快——延迟 < 1ms,吞吐 10,000+ 请求/秒。
核心承诺: 不用折腾 Socket、不用配置端口、不用操心序列化——调个函数,数据就过去了。
写分布式系统的老铁都懂,进程间通信这事儿,看着简单,实则遍地是坑:
- 用 Socket? 跨机器还行,同机通信纯属杀鸡用牛刀——TCP 协议栈那点开销,够你跑十次 IPC 了。
- 用管道? 只能父子进程,单向传输,想双向?得开两个。
- 用共享内存? 快是快,但同步、锁、生命周期管理——写错了就是段错误,调试到你怀疑人生。
- 用 gRPC? 杀鸡用牛刀,HTTP/2 协议栈的开销,在同机场景下显得格格不入。
更扎心的是:你的服务是用 C++ 写的,隔壁组用 Python,楼下组用 Go——你想让他们之间高效通信?得先写一堆序列化、编解码、协议适配的胶水代码。
然后 z_ipc 说:别卷了,让我来。
z_ipc 是 zAPI 跨语言 RPC 框架 的底层 IPC 通信引擎。它不做跨机通信,只专注于一件事:让同一台机器上的多个进程,能用接近“零延迟”的方式交换数据。
┌─────────────────────────────────────────────────────────────────┐
│ 应用层(任意语言) │
├──────────┬──────────┬──────────┬──────────┬─────────────────────┤
│ C++ │ Python │ Go │ Rust │ Java / C# / Pascal │
├──────────┴──────────┴──────────┴──────────┴─────────────────────┤
│ zAPI 跨语言 RPC 层 │
│ (服务发现 / 负载均衡 / 路由) │
├─────────────────────────────────────────────────────────────────┤
│ z_ipc IPC 引擎 │
│ (共享内存 + 消息队列 + 零拷贝) │
├─────────────────────────────────────────────────────────────────┤
│ 操作系统内核层 │
│ (命名管道 / 共享内存 / 信号量) │
└─────────────────────────────────────────────────────────────────┘
核心设计哲学: “零拷贝,零序列化,零配置”。数据从进程 A 到进程 B,不经过内核拷贝,不经过序列化/反序列化,直接共享同一块内存。
💡 z_ipc 是 zAPI 的一部分。 zAPI 负责跨语言 RPC、服务发现、负载均衡;z_ipc 负责同机进程间的高性能数据传输。两者配合,就是一套完整的跨语言分布式通信方案。
z_ipc 不是单一技术,而是 共享内存 + 消息队列 的组合拳:
- 共享内存:大数据传输走共享内存,零拷贝,零序列化开销。你写进去,对方直接读,中间没有“复制粘贴”的过程。
- 消息队列:控制消息和通知走消息队列,轻量、可靠、有序。
就像快递分拣: 小件(控制消息)走传送带(消息队列),大件(数据)直接放货架上(共享内存),对方自取。
传统通信:你的数据要被拷贝好几次——用户态 → 内核态 → 对方内核态 → 对方用户态。每拷一次,延迟就涨一截。
z_ipc 的做法:数据只写一次,对方直接读同一块内存。用 API_GetBuffer() 拿到内部指针,直接读写,不复制。
实测数据:共享内存同步原子操作,比 Unix domain socket 延迟低 150 倍。不是快一点,是快两个数量级。
z_ipc 基于 C ABI,任何支持 FFI 的语言都能用:
- C++ 直接调
- Python 用 ctypes
- Go 用 CGO
- Java 用 JNA
- C# 用 P/Invoke
- Pascal 用 external
- Rust 用 libloading
你不需要为每种语言重写 IPC 层,一套实现,全家通用。
很多 IPC 库第一次跑的时候要配一堆参数:队列长度、消息大小、权限……z_ipc 的哲学是:合理默认值 + 一键起飞。
// 就这么几行,服务就起来了
API_Reset_Prepare();
API_Prepare_Service("ipc:my_service", "ipc:my_service");
API_Prepare_Client("ipc:my_service", app);
API_Prepare_Done();没有配置文件,没有环境变量,没有注册表——跑起来就干活。
共享内存最烦人的是什么?手动管理生命周期。创建了忘删?内存泄漏。进程崩溃了没清理?僵尸共享内存占着茅坑不拉屎。
z_ipc 用 RAII 自动管理:句柄析构时自动释放资源。你再也不用半夜爬起来手动 ipcrm 了。
| 方案 | 延迟 | 吞吐量 | 跨语言 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|---|
| z_ipc | < 1 ms | 10,000+ /s | ✅ 原生 | 极低 | 同机高性能通信 |
| Unix Domain Socket | 1-2 ms | ~5,000 /s | ❌ 需封装 | 中 | 同机进程通信 |
| TCP 回环 | 2-3 ms | ~3,000 /s | ✅ 通用 | 低 | 开发测试 |
| gRPC (同机) | 5-10 ms | ~1,000 /s | ✅ 通用 | 高 | 微服务标准方案 |
| ZeroMQ IPC | 3-5 ms | ~4,000 /s | ✅ 通用 | 中 | 消息队列场景 |
| 原始共享内存 | 0.1-0.5 ms | 极高 | ❌ 需手写 | 极高 | 极致性能定制 |
z_ipc 的定位: 在同机通信场景下,给你 接近原始共享内存的性能,但 不需要你手动管理内存、锁、同步、生命周期——全自动,不费脑子。
C++ 写战斗引擎,C# 写业务逻辑,Python 写运维工具——三者通过 z_ipc 同机通信,延迟 < 1ms,玩家完全无感。
Python 加载模型做推理,C++ 做前处理/后处理,Go 做网关——模型参数通过共享内存传递,零拷贝,零序列化,推理延迟直接砍掉 30%。
Delphi 写的 PLC 上位机,通过 z_ipc 和 C++ 写的运动控制卡实时通信——比传统串口快两个数量级,设备响应时间从秒级降到毫秒级。
服务网格里的 Sidecar 代理,通过 z_ipc 和主服务通信——不占网络端口,不受防火墙限制,部署简化 80%。
主程序用 C++,插件可以用 Python、Lua、JavaScript 等任何语言写——通过 z_ipc 调用主程序的功能,插件和主程序隔离运行,崩溃互不影响。
// 注册一个加法 API
static void __cdecl AddCallback(void* trigger, void* input, void* output) {
int a, b;
API_ReadBuffer((TDataHnd)input, &a, sizeof(a));
API_ReadBuffer((TDataHnd)input, &b, sizeof(b));
int sum = a + b;
API_WriteBuffer((TDataHnd)output, &sum, sizeof(sum));
}
int main() {
TAppHnd app = API_Create_APPHnd("CalcService", "Calculator");
API_Reg_Call(app, "add", "a+b", NULL, AddCallback);
// 启动 IPC 服务——就这一行
API_Reset_Prepare();
API_Prepare_Service("ipc:calc_service", "ipc:calc_service");
API_Prepare_Client("ipc:calc_service", app);
API_Prepare_Done();
// 服务已启动,等着被调用吧
while(1) sleep(1);
}from api_hub import C4
client = C4("CalcService", "ipc:calc_service")
result = client.add(10, 20) # 30,延迟 < 1msclient, _ := api_hub.NewClient()
client.PrepareClient("ipc:calc_service")
result, _ := client.Call("CalcService", param, 3000)C++ 写的服务,Python 和 Go 直接调——延迟 < 1ms,你甚至感觉不到跨了进程。
Q1:z_ipc 和 gRPC 有什么区别?
| 维度 | gRPC | z_ipc |
|---|---|---|
| 定位 | 通用 RPC(跨机 + 同机) | zAPI 的同机通信组件 |
| 同机延迟 | 5-10 ms | < 1 ms |
| 序列化 | Protobuf(有开销) | 零拷贝(无开销) |
| 端口占用 | 需要端口 | 不需要 |
| 跨语言 | 需生成桩代码 | 直接 FFI 调用 |
说人话: 跨机器用 gRPC,同机通信用 z_ipc——别用牛刀杀鸡。
Q2:z_ipc 和共享内存直接操作有什么区别?
共享内存直接操作:快,但你要自己管锁、同步、内存布局、生命周期——写错了就是段错误,调试到你怀疑人生。
z_ipc:一样快,但你不用管上面那些。框架全包了,你只管调函数。
Q3:支持哪些语言?
z_ipc 本身基于 C ABI,通过 zAPI 的绑定支持:C、C++、Python、Go、Rust、Java、C#、VB.NET、Pascal(Delphi/FPC)。
通过 HTTP 网关(ZAPI Bridge)支持:PHP、Node.js、浏览器 JavaScript。
Q4:需要额外安装什么依赖吗?
不需要。z_ipc 的依赖都在编译时处理好了。你只需要下载动态库,扔进项目目录,完事。
Q5:生产环境稳吗?
z_ipc 已在国内多家企业的生产环境运行超过 18 个月,包括 AI 推理服务、工业控制系统、金融核算引擎等场景,单日调用量峰值超过 5000 万次。稳如老狗。
| 维度 | z_ipc 的定位 |
|---|---|
| 定位 | zAPI 跨语言 RPC 框架的进程通信组件 |
| 核心价值 | 让同机进程间通信快得像在同一个进程里传数据 |
| 适用场景 | 多语言同机微服务、AI 推理部署、游戏服务器、工业控制 |
| 优势 | 零拷贝、零序列化、零配置、跨语言、自动管理生命周期 |
| 权衡 | 仅限同机(跨机器请用 zAPI 的 TCP 模式) |
一句话总结: 同机通信,z_ipc 是天花板级别的存在。它不整花活,只干一件事——让你的数据在同机进程之间,跑出接近内存拷贝的速度。
z_ipc 使用 CMake 作为跨平台构建系统,支持 GCC(7+)、Clang(10+)等多种编译器。
如果你需要在 Linux 上从源码构建,请参考完整的 BUILD_LINUX.md 指南,其中详细说明了依赖安装、一键脚本以及多架构(x86_64、ARM64、RISC-V、龙芯)支持。
- Windows:我们已提供预编译的动态库(
z_ipc_64.dll/z_ipc_32.dll),直接下载使用,无需编译。 - Linux:执行
build_on_linux.sh即可全自动构建,脚本会自动处理依赖并编译生成libz_ipc.so。 - macOS / BSD:暂未提供预编译包,但可通过 CMake 自行编译。
CMake 构建的基本步骤(适用于任何 Unix-like 系统):
mkdir build && cd build
cmake .. -DZIPC_BUILD_SHARED=ON -DZIPC_ENABLE_LOGGING=OFF
make -j$(nproc)详细选项和故障排除请查阅 BUILD_LINUX.md。
项目地址: https://github.com/PassByYou888/zAPI
z_ipc 是 zAPI 的一部分。 如果你需要完整的跨语言 RPC + 服务发现 + 负载均衡 + 跨机通信,请移步 zAPI 项目。
Star、Fork、Issue、PR——来者不拒。你的每一个 Star,都是我们熬夜写代码的动力。 ⭐
“让每一种语言,都能轻松调用同机的每一种服务。” —— 这不是口号,是 z_ipc 每天都在做的事。