何时应该使用 Pipes 或 gRPC 进行进程间通信(在 C# .NET Core 中)?

Posted

技术标签:

【中文标题】何时应该使用 Pipes 或 gRPC 进行进程间通信(在 C# .NET Core 中)?【英文标题】:When should I use Pipes or gRPC for interprocess communication (in C# .NET Core)? 【发布时间】:2022-01-22 02:03:26 【问题描述】:

Pipes 和 ASP.NET Core gRPC 都支持 local 和远程 IPC/RPC(gRPC 有一些平台限制)

我什么时候会使用一种技术(管道)或另一种技术(gRPC)?

我要记住的观察、想法和注意事项:

gRPC 似乎打算在未来的某个迭代中替换 WCF。

本地部署和机器限制(以非管理员/用户身份运行、机器防火墙、不同平台/操作系统)

网络穿越,同机兼容->多机(前端/后端阵列)进行加载和扩展

跨越安全区域(使用代理或其他 TLS 密码/顺序/注册表设置)会影响 HTTP/2 的工作能力

管道(命名管道?)具有不同的表面积和端口(它们是否也使用端口 135 或 TCP 上的 NetBios(不确定名称))...如何对其进行扫描和保护?

“内存映射文件”似乎是一个挑战,但它似乎可以在 UDS 配置中使用 gRPC 的 ASP.NET Core 中工作。这是一个正确的推论吗?

现在我的方案是让两个控制台应用程序相互通信,同一台机器或远程。添加 Asp.NET Core Web 是我的方案的可选前端替代方案。

【问题讨论】:

远程命名管道:说不。如果您能提供帮助,您不会想与 NetBIOS 上床。本地命名管道很好,但如果您无论如何都将允许/要求远程场景,那么与本地 TCP 连接相比几乎没有优势。如果所有通信都将严格地在本地进行,那么在速度方面很难击败它们(共享内存可以但更难编程,至少在 Windows 上是这样)。 @JeroenMostert 是this 使用共享内存,还是文件上的共享锁? 我也不清楚上面链接的“管道”是否等同于 NetBIOS。这是否也意味着它可能传播到 WINS 命名系统,或者可以传播?只是想看到完整的画面。 gRPC 是具有特定负载的 HTTP,所以您的问题变成了 Should I use pipes or HTTP? gRPC 有哪些平台限制? 【参考方案1】:

简单的 IPC

取决于将要发生的通信量。如果您的通信仅限于在两个进程之间传递或共享一些数据的简单协作信号,您可以在本地系统或本地网络上安全地使用NamedPipeClientStream 和NamedPipeServerStream,但如果您计划在不同系统上使用相同的方法,那么我建议使用@ 987654323@和TcpListener。

综合IPC

WCF 或现在它的替代 gRPC 用于需要远程执行完整 API/框架的场景。例如,我有一个完整的类库,我需要从不同的进程(主要在不同的系统上运行)调用它们;在这种情况下,gRPC 类型的解决方案更有意义。

只有你可以决定。

这是一个对您的应用程序非常独特的设计决策;你未来的计划和你的系统环境,任何第三者都只能给你线索,但最终你是唯一能做出正确决定的人。

【讨论】:

谢谢。与 IPC 做事方式相比,您如何/在哪里考虑 SignalR、Websocket 或 REST API? @TLDR REST API 对于 Web 应用程序来说可以像 gRPC 一样全面。 WebSocket 是非常低级的 Web API,SignalR 是 WebSockets 之上的用户友好层,但它仍然应该用于相当简单的通信。

以上是关于何时应该使用 Pipes 或 gRPC 进行进程间通信(在 C# .NET Core 中)?的主要内容,如果未能解决你的问题,请参考以下文章

python 学习笔记 - Queue & Pipes,进程间通讯

进程间通信、操作系统、管道

检查 gRPC 流何时为空或不是流式传输数据

C++跨平台:grpc和zmq的方案预研

C++跨平台:grpc和zmq的方案预研

interprocess communication (IPC) 进程间通信