noli
V2EX  ›  .NET

.Net Core 中如何实现 Worker 子进程处理一个 Socket

  •  
  •   noli · Oct 15, 2017 · 5018 views
    This topic created in 3209 days ago, the information mentioned may be changed or developed.

    有大神分享一下 Socket.DuplicateAndClose 的使用经验吗?

    9 replies    2017-10-16 01:59:35 +08:00
    longaiwp
        2
    longaiwp  
       Oct 15, 2017
    看代码是不支持的
    noli
        3
    noli  
    OP
       Oct 15, 2017
    hjc4869
        4
    hjc4869  
       Oct 16, 2017 via Android
    @noli 都上 .NET 了还玩个什么 worker 子进程,直接上线程池不就好?
    用 Socket.Handle 把 fd 拿出来 P/Invoke 理论上是可以,但是还真没见过这么用的,而且 .NET Socket 也不能用 fd(handle)直接构造,传到另一个进程就只能用 native api 了。
    wellsc
        5
    wellsc  
       Oct 16, 2017 via iPhone
    一个进程一个连接的话,消耗有点大。建议用线程或者协程处理网络连接
    noli
        6
    noli  
    OP
       Oct 16, 2017
    @hjc4869

    多线程要玩,多进程也要玩。
    主要是有些插件式的代码不可控,放在其他进程可以随便崩,listener 的进程不用管。

    @wellsc

    长连接的应用,平均起来代价不会特别大。
    不像主要是 HTTP 的一个请求一连接,不值得。

    不过怎么复用这些进程倒是要考量一下。
    hjc4869
        7
    hjc4869  
       Oct 16, 2017 via Android   ❤️ 1
    @noli 可以让 listener 的进程做一个类似 proxy 的工作,用 TCP loopback/UNIX domain Socket/pipe 去连接后面的 worker 并且转发数据,如果能够接受这样的开销。
    如果不能接受,大概就只能打开 Reuse address,然后起多个 listener 了。
    noli
        8
    noli  
    OP
       Oct 16, 2017
    @hjc4869

    大神感谢你的提示!我怎么没想起还可以用 Reuse Address 呢!

    然后再解决一下多个 Listener 的惊群问题,这样的性能肯定可以接受!
    noli
        9
    noli  
    OP
       Oct 16, 2017
    @hjc4869

    如果我没有理解错的话,TcpListener 已经考虑到 ReuseAddress 的需求,因此设计了
    [TcpListener.ExclusiveAddressUse]( https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.tcplistener.exclusiveaddressuse?view=netcore-2.0) 的属性。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3954 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 00:52 · PVG 08:52 · LAX 17:52 · JFK 20:52
    ♥ Do have faith in what you're doing.