V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noli
V2EX  ›  .NET

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

  •  
  •   noli · 2017-10-15 21:24:25 +08:00 · 4324 次点击
    这是一个创建于 2356 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    @wellsc

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

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

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

    然后再解决一下多个 Listener 的惊群问题,这样的性能肯定可以接受!
    noli
        9
    noli  
    OP
       2017-10-16 01:59:35 +08:00
    @hjc4869

    如果我没有理解错的话,TcpListener 已经考虑到 ReuseAddress 的需求,因此设计了
    [TcpListener.ExclusiveAddressUse]( https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.tcplistener.exclusiveaddressuse?view=netcore-2.0) 的属性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1010 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:58 · PVG 03:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.