我正在尝试学习Erlang来做一些简单但可扩展的网络编程。我基本上想写一个程序,做互联网骨干上的服务器所做的事情——但规模较小。我想尝试使用Web可访问的服务器设置一个内部网,该服务器将充当内部网[原文如此]的网关,并将数据路由到连接的客户端和/或其他网关。
高流量来自这样一个事实,即数据不仅会从客户端流向网关再到客户端,而且可能必须在几个网关周围反弹才能到达目的地(例如数据在互联网上的传输方式)。这意味着网关不仅要处理来自其客户端的流量,还要处理来自其他网关客户端的流量。
我认为这会导致异常高水平的流量,即使对于中等数量的客户端和网关也是如此。
来自Python的背景,在较小程度上,来自其他脚本语言,我习惯于挖掘一个定制的模块来解决我的问题。我知道 Erlang 是为高流量网络编程而设计的,但我能找到的关于这种东西的库/模块只是gen_tcp。
这是否意味着 Erlang 已经针对此类事情进行了优化,您可以使用其最基本的模块启动它并期望它很好地扩展?
您可以期望gen_tcp
即使在大负载条件下也能表现出色。如果你只是要传递数据而不处理太多,那么我的猜测是你将能够很好地扩展 - 实际上你只是在传递指针。
所有已知的用 Erlang 编写的可扩展解决方案都使用gen_tcp
:
- 牛仔,麻糬网,雅司病,...
- 里亚克
- 埃洪流
- 兔子MQ
等等。使用它时,有一个提示值得一提:确保按erl +K true
运行 erl,以便访问内核轮询。也就是说,在Linux上epoll()
,在BSD上kqueue()/kevent()
,在Solaris上/dev/poll
。另请注意,您可以向 TCP 端口提供命令以设置其选项,包括缓冲区大小等。最后,对于某些类型的数据包,您可以让 C 层为您解析数据包,请参阅erl -man inet
和setopts/2
调用。一个例子是{packet, 4}
它非常受欢迎。
一般来说,Erlang 有一个相当快的 I/O 子层。您可以期望它执行得非常快,即使对于大型复杂交互也是如此。