我正在编写一个服务器(基于 Java),它只能由同一主机上的程序调用。
那么,在性能和可靠性方面,我应该使用 UDP 还是只使用 Unix Socket?
我正在编写一个服务器(基于 Java),它只能由同一主机上的程序调用。
那么,在性能和可靠性方面,我应该使用 UDP 还是只使用 Unix Socket?
UDP 不可靠。我正在挑选尼特,但无法保证使用 UDP 交付订单或交付。在同一主机上的两个进程之间,这可能永远不会成为问题,但在极端负载情况下可能会出现。
UDP 数据包中的开销也比 Unix 套接字中的多得多。同样,除非在最极端的负载下,这不太可能成为实际问题,并且在此之前您会遇到许多其他与负载相关的问题,因为两者的开销在现代计算术语中都是名义上的。
如果您真的担心性能和可靠性,请坚持使用 Unix 套接字。
如果您将来有任何分发和负载平衡的计划,如果您需要支持多个主机,UDP 将为您提供更大的灵活性。
说了这么多,现在这些都不是实际问题。大多数服务甚至使用 TCP 进行本地通信,然后在此之上分层其他服务,如ZeroMQ 。您几乎绝对不应该担心这种性能水平。使用使您的代码更易于编写和维护的软件,并在您需要的不太可能发生的情况下扩展系统。将新服务器扔到问题上比花费工时重新设计不是为了灵活而编写的软件更容易也更便宜。
另请注意,ZeroMQ(和其他消息队列系统)将选择最有效的传输机制。例如,如果可能,ZeroMQ 将使用 IPC(进程间通信),这比 UDP 或 Unix 套接字快得多,如果您需要,它还将通过 Internet 扩展到全球数千台主机,您基本上赢了不必更改您的代码。
永远不要过早地优化。
unix 套接字肯定会为您节省通过 tcp/ip 堆栈进行上下文切换和封装/解封装的开销。但这种收益会有多大?我认为这取决于您对性能和可靠性的要求以及您期望此服务器处理的负载。