Unix Domain socket
A UNIX socket is an inter-process communication mechanism that allows bidirectional data exchange between processes running on the same machine.
Unix Domain Socket(后面统一简称 UDS)是在socket的框架上发展出一种IPC(inter-process communication)机制。对于本地的进程间通信,Unix Domain socket 比TCP / IP环回连接更安全,更有效。 使用起来和传统的 socket 非常的相似。 区别点主要有两个地方需要关注。
第一,在创建 socket 的时候,普通的 socket 第一个参数 family 为 AF_INET, 而 UDS 指定为 AF_UNIX 即可。
第二,Server 的标识不再是 ip 和 端口,而是一个路径,例如 /dev/shm/fpm-cgi.sock,其实在平时我们使用 UDS 并不一定需要去写一段代码,很多应用程序都支持在本机网络 IO 的时候配置。
在k8s 上通过共享卷来实现的: https://kubernetes.io/zh/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/,这样你就好理解Dapr 的配置参数 dapr.io/unix-domain-socket-path。相关的Issue 可以参考 https://github.com/dapr/dapr/issues/4309。
Dapr 1.7 版本带来了UDS的支持,现在,您可以在使用注释 dapr.io/unix-domain-socket-path 调用 Dapr sidecar 时将 Unix Domain Sockets 与 Kubernetes(以及自托管)一起使用,以提高吞吐量并降低延迟。
Dapr 对 UDS 支持的平台目前是Linux,还不支持Windows(Unix-domain sockets have long been a feature of most Unix platforms, and are now supported in Windows 10 and Windows Server 2019) ,Dapr 1.8 版本已经安排支持了,正在开发中,具体参见Issue: https://github.com/dapr/dapr/issues/4128。