采访SimplSockets的创建者David Haney

2013 年 12 月 12 日

我们就当前环境下 TCP 编程相关的问题采访了 SimplSockets for .NET 的创建者 David Haney。

InfoQ:现在大多数人好像更乐于使用 HTTP 协议而不是像 TCP 这样的更底层的协议。那么你认为 TCP 和 UDP 依然重要的原因是什么?

HTTP 是一个非常优秀的通信协议,可以用于许多目的和应用程序。它能够为你处理消息框架、错误码以及底层网络通信的其他方面,让通信变得非常简单。但是,这种易用性同时也伴随着由 HTTP 协议规范(建立在 TCP 协议之上)所引入的大量开销。虽然大部分应用程序能够从 HTTP 的简单性上受益匪浅,但是有一些应用程序则将网络性能视为成功的关键。这些应用程序的目标是将所有的空闲周期压榨出自己的代码从而实现吞吐量的最大化,而 HTTP 协议的开销和与其相关的头对于他们而言毫无意义。这种应用程序的示例是搜索引擎、分布式缓存解决方案以及视频流服务。对于这种类型的应用程序,HTTP 根本不能匹配 TCP 或者 UDP 的性能。尽管实现起来更加复杂,但是 TCP 和 UDP 极大地提高了吞吐量,尽可能地实现了应用程序的高性能。

InfoQ: SimplSockets 提供的哪些内容胜过了.NET 内置的 socket 类库?

SimplSockets 的目标并不是彻底改造已经运行良好的轮子,也就是.NET sockets;相反的,它是构建在.NET sockets 之上的。在 sockets 之上实现定制通信协议的时候,有很多样板(boilerplate)或者“经典的”问题必须要处理,但是它们并不容易解决。例如,你并不能控制一个 TCP socket 如何分发你的消息。它可能会选择在一个包里面分发,也可能是 10 个包,甚至有可能是 50 个包,你必须做一些手工劳动将这些包的信息重新组合成原始消息。除此之外,TCP 并不会告诉你还有多少字节的消息需要等待接收,所以你必须设计一个定制的协议头,通过它告诉接收器在消息完成之前还有多少字节的信息需要接收……然后如果你接收到了一部分消息之后与发送者断开了连接,那么将会发生什么?你不能一直等待直到接收到所有的消息,所以你必须创建超时或者故障系统。因此,你在创建定制协议的这条路上走的越远,就会发现越多的问题需要处理,这个水会越来越深。

既然使用 TCP sockets 的其他所有人都需要解决这些问题,那么为什么还要自己去解决呢?这正是我对开源类库用途的感觉。因此,我构建了 SimplSockets 填充这个空白,同时解决了这些典型的 TCP sockets 问题,所有人都能够使用或者重用它。对于使用的定制协议,每个消息(不是每个包)伴随着 8 个字节的开销,但是我认为相对于它所带来的好处这是一个非常好的折衷。一个主要的好处是客户端多路技术:一个到服务器的开放连接可以被多个线程使用,完全是线程安全的。这样有助于避免端口枯竭以及设置 / 销毁连接的开销。服务器端实现完全是异步的,同时利用了完成线程和专有对象池 / 再利用,让你的应用程序能够保持难以置信的性能。

SimplSockets 的目标是让.NET sockets 更好、更加易用,并不是为了与众不同或者专用。

InfoQ:SimplSockets 有没有提供 async/await 或者 IObservable 支持?

SimplSockets 没有提供 async/await 或者 IObservable 支持,这是由设计决定的。我想让没有使用.NET 4.5 的人也能够使用 SimplSockets,因为它实际上并没有依赖于任何.NET 4.5 引入的功能。将.NET 4.0 作为目标版本可以让更多的人使用它,但是将来我可能会针对.NET 4.5 引入一个支持 async/await 的版本。

InfoQ:对于所有的开源项目而言许可都是非常重要的。为什么你会为 SimplSockets 选择 GPL 3 许可?

作为一个人类同时也是一位开发人员,我相信在学习和发展过程中分享知识是非常重要的。话虽如此,但是我同时也认为如果你的工作能够让其他人受益那么就应该获得报酬。结果便是我选择了 GPL v3 平衡自己的人生观:其他的开源或者免费项目可以免费使用它,但是另外一些打算从中受益的人必须依照商业许可付费。

InfoQ:你计划在将来版本的 SimplSockets 中实现哪些功能?

下一个版本将会包含一个更加强健的通信超时系统,支持可配置的超时间隔。除此之外,我希望发布一个能够在.NET Micro Framework 上运行的 SimplSockets 版本,让.NET 驱动的底层嵌入式系统也能够利用它。除了路线图之外,我还计划处理用户对该类库的所有建议,同时愿意讨论潜在的改进;我并不认为一时半会就能找到所有的答案或者想的很全面。

查看英文原文 Interview with David Haney, Creator of SimplSockets

2013 年 12 月 12 日 05:22468
用户头像

发布了 321 篇内容, 共 102.0 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

LeetCode题解:47. 全排列 II,回溯,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

今天你的idea崩了吗?分享6种“白嫖”正版idea的途径,真香定律

小Q

学习 架构 面试 开发 IntelliJ IDEA

vim快捷键收藏版

良知犹存

vim

它可能是分布式系统中最重要的枢纽

架构师修行之路

分布式 微服务 注册

为你总结了N个真实线上故障,从容应对面试官!

AI乔治

Java 架构 GC

Dubbo 微服务调用时序图

Acker飏

陈山枝:5G+车联网 推动中国特色车路协同发展

Geek_459987

如何在微信公众号图文中插入外链

Ceelog

微信公众号

中国银行前行长李礼辉:区块链技术优势与产业前景

CECBC区块链专委会

区块链 数字货币

JVM系列-第一节:JVM简介、运行时数据区、内存分代模型

诸葛小猿

Java JVM JVM简介 运行时数据区 内存分代模型

自我管理系列-为啥要做生产问题分析报告呀

罗小龙

复盘 IT, 经验总结 职场搞笑 生产事故

视频客服的应用和优点

anyRTC开发者

音视频 WebRTC 直播 RTC

初识Kafka及安装

犟马骝

"全能"人才的概念真的对吗

supernova

创业 读书笔记 随笔杂谈

杰哥获奖了!

JackTian

Linux 程序人生 运维工程师 运维人生

架构师训练营 1 期 -- 第六周作业

曾彪彪

极客大学架构师训练营

32个问题,学习Java虚拟机的运行时数据区

AI乔治

Java 架构 JVM JVM虚拟机原理

甲方日常 39

句子

工作 随笔杂谈 日常

数字货币交易所开发源码,场外OTC交易平台搭建

WX13823153201

新基建下区块链基础设施建设

CECBC区块链专委会

区块链

系统从初期到支撑亿级流量,都经历了哪些架构的变迁?

冰河

分布式 微服务 系统架构 SOA 垂直架构

区块链助力跨省、零材料办理 成都武侯打造“中国政务服务第一链”

CECBC区块链专委会

区块链

信息量爆炸!78天闭门深造1258页SpringCloud学习进阶笔记,再战蚂蚁金服

996小迁

Java 架构 面试 SpringCloud

阿里技术专家撰写程序员“不迷茫”职业路指南,切中痛点规划未来

周老师

Java 编程 程序员 架构 面试

一次艰难的内存泄露排查,BeanUtils的锅

AI乔治

Java 架构

英特尔老矣,尚能“转”否?

脑极体

算法学习1-- 数组常见问题

菜鸟小sailor 🐕

算法和数据结构

分布式系统使用网关到底是好还是坏?

架构师修行之路

分布式 微服务 网关

同学信誓旦旦地说,我司的系统从来不做性能调优!

沉默王二

Java 性能调优

京东智联云4篇论文入选国际语音顶级大会Interspeech 2020

京东智联云开发者

人工智能 大数据 语音识别

面试阿里P6,过关斩将直通2面,结果3面找了个架构师来吊打我?

Java架构之路

Java 程序员 架构 面试 编程语言

采访SimplSockets的创建者David Haney-InfoQ