Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 正在使用Erlang';s gen_tcp构建高流量套接字服务器的可扩展方法_Sockets_Asynchronous_Network Programming_Erlang_Gen Tcp - Fatal编程技术网

Sockets 正在使用Erlang';s gen_tcp构建高流量套接字服务器的可扩展方法

Sockets 正在使用Erlang';s gen_tcp构建高流量套接字服务器的可扩展方法,sockets,asynchronous,network-programming,erlang,gen-tcp,Sockets,Asynchronous,Network Programming,Erlang,Gen Tcp,我正在尝试学习Erlang来做一些简单但可扩展的网络编程。我基本上想写一个程序,做互联网主干上的服务器所做的事情——但规模较小。我想尝试建立一个具有可访问web的服务器的intranet,该服务器将充当intranet的网关[sic],并将数据路由到连接的客户端和/或其他网关 高流量将来自这样一个事实,即数据不仅会从一个客户端流向另一个网关,而且可能需要在几个网关之间来回跳跃才能到达目的地(比如数据在互联网上的传输方式)。这意味着网关不仅要处理来自其客户端的流量,还要处理来自其他网关客户端的流量

我正在尝试学习Erlang来做一些简单但可扩展的网络编程。我基本上想写一个程序,做互联网主干上的服务器所做的事情——但规模较小。我想尝试建立一个具有可访问web的服务器的intranet,该服务器将充当intranet的网关[sic],并将数据路由到连接的客户端和/或其他网关

高流量将来自这样一个事实,即数据不仅会从一个客户端流向另一个网关,而且可能需要在几个网关之间来回跳跃才能到达目的地(比如数据在互联网上的传输方式)。这意味着网关不仅要处理来自其客户端的流量,还要处理来自其他网关客户端的流量

我认为这将导致异常高的流量水平,即使对于中等数量的客户端和网关也是如此

我有Python的背景,在较小程度上还有其他脚本语言,我习惯于挖掘自定义模块来解决我的问题。我知道Erlang是为高流量网络编程而设计的,但我能找到的关于这类东西的库/模块就是gen_tcp


这是否意味着Erlang已经针对这类事情进行了优化,您可以使用其最基本的模块启动它,并期望它能够很好地扩展?

您可以期望
gen_tcp
即使在大负载的情况下也能非常好地执行。如果您只是传递数据,而不进行太多的处理,那么我的猜测是您将能够很好地扩展—实际上您只是传递指针

所有以Erlang编写的已知可扩展解决方案都使用
gen_tcp

  • 牛仔,摩奇网,雅司病
  • 里亚克
  • 当前
  • 兔子
等等。在使用它时,有一个值得一提的提示:确保以
erl+ktrue
的形式运行erl,以便访问内核轮询。也就是说,在Linux上是
epoll()
,在BSD上是
kqueue()/kevent()
,在Solaris上是
/dev/poll
。还请注意,您可以向TCP端口发出命令,以设置它们的选项w.r.t.缓冲区大小等。最后,对于某些类型的数据包,您可以让C层为您解析数据包,请参见
erl-maninet
setopts/2
调用。一个例子是非常流行的
{packet,4}

一般来说,Erlang有一个相当快的I/O子层。您可以期望它执行得非常快,即使对于大型复杂的交互也是如此