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

2017-10-15 21:24:25 +08:00
 noli

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

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

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

@wellsc

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

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

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

然后再解决一下多个 Listener 的惊群问题,这样的性能肯定可以接受!
noli
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) 的属性。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/397843

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX