写书写到一半,强迫症发作跑去给HotChocolate修bug
前言
这是写作《C#与.NET6 开发从入门到实践》时的小故事,作为本书正式上市的宣传,在此分享给大家。
正文
.NET目前有两个比较成熟的GraphQL框架,其中一个是HotChocolate,在使用对比后认为这个使用更方便,因此将其作为本书的介绍内容。结果在研究客户端订阅的时候发现一个bug:如果订阅因为异常(例如网络掉线)而结束,订阅不会有任何反应(只是这个订阅永远不会再收到数据)。我就在想,如果一个订阅长时间没有收到数据,到底是因为出问题了还是只是单纯的没有新数据。
随后我就跑到GitHub上提交问题,结果作者并没有理解我的意思,然后就不了了之。最后在准备实战演练的项目时又用到了客户端,又想起来这个bug,就当场强迫症发作又给作者提问题,结果又是石沉大海。无奈干脆下载代码亲自研究客户端到底是哪里出问题导致这个bug。感兴趣的朋友可以看看https://github.com/ChilliCream/graphql-platform/issues/5006。
这里我就简单介绍一下问题的原因和处理方法。客户端在WebSocket和订阅实例之间使用Pipeline作为中介,然后使用Channel向用户API传递解析后的对象。其中数据读取和写入使用两个Task分别负责,读取WebSocket写入Pipeline的Task在循环读取WebSocket的时候没有向Channel传递表示连接结束的对象,导致客户端实例不知道实情,最后用户API没有任何反。用户API中使用的IObserver也是一个关键点,客户端在订阅异常结束时没有调用Complete方法通知观察者数据流已经结束,导致用户API没有反应。根据微软文档,应该在确定数据流结束后调用Complete方法通知观察者结束观察,无论数据流因何结束。
客户端使用的Pipeline是一个网络数据缓存的优秀中介,手动处理粘包数据是非常麻烦的,Pipeline就专门负责管理数据是否被消耗,查看过但没有被消耗的数据应该如何处理。新的Span和Memory类型则可以实现直接访问缓冲区内存,避免查看但不消耗数据的情况下反复复制内存导致性能下降和内存占用上升。
结果作者在使用Pipeline之后切断了WebSocket和用户API之间的直接联系又没有处理相关情况最后导致了这个bug。目前作者正在考虑改用其他方式实现客户端,这个问题也许会自然消失。我的修复已经合并到主分支,不过被标记到13.0上,但是客户端目前12.0和13.0的包共存,12.0的代码生成器生成的代码和13.0的实现不兼容。不知道12.0版有没有包含修复。
结语
这个问题前前后后历时将近半年,真是把我折磨的够呛。最后请让我再宣传一次我的新书《C#与.NET6 开发从入门到实践》。详情请看《C#与.NET6 开发从入门到实践》上市,作者亲自来打广告了!。
购买方式:
京东自营:https://item.jd.com/13860498.html
当当自营:https://product.dangdang.com/29546824.html
本文地址:https://www.cnblogs.com/coredx/p/17253035.html
写书写到一半,强迫症发作跑去给HotChocolate修bug的更多相关文章
- 手把手教大家写书写一个Mqtt网关
摘要:物联网是现在比较热门的软件领域,众多物联网厂商都有自己的物联网平台,而物联网平台其中一个核心的模块就是Mqtt网关. 本文分享自华为云社区<一文带你掌握物联网mqtt网关搭建背后的技术原理 ...
- Python3.7.2,在Linux上跑来跑去的,是在升级打怪么?
Python3.7.2,在Linux上跑来跑去的,是在升级打怪么? 前不久,发布了Python在Windows(程序员:Python学不学?完全没必要纠结)和Mac OS(我是Python,P派第 ...
- 世界上最痛苦的事就是去改别人的bug!!!!
世界上最痛苦的事就是去改别人的bug!!!!
- windows服务写完之后怎么让它跑起来
当然你可以在命令框里面自己去手动的敲代码,也可以写一个.bat文件一劳永逸......这里我就介绍写.bat文件的方法 就是上图所示的三个东东啦,有了这三个东东,把他们拖到你windows服务的deb ...
- 想着模仿京东微信首页呢,banner滚动搞定了,写到了一半了
接着上篇 微信小程序-阅读小程序demo写:http://www.cnblogs.com/muyixiaoguang/p/5917986.html 想着模仿京东首页呢,结果也没赶得及写完,轮播图让我搞 ...
- 记作为前端开发人员跑去面试C#.NET
先谈结果,"秦总",与我面试讨论一个半小时,十分感动,然后拒绝了我. 本月17日16时许,收到邀请,于18日9时到司面试,虽如今仅深入前端领域,皆因曾有1年ASP.NET(C#)的 ...
- 放弃了程序员互联网高薪,跑去事业单位做IT的尴尬
“你是程序员对吧?”“是啊,怎么了?”“那你帮我修一下电脑吧.”我原来也是一个重点大学毕业,基本上事业里面搞IT就干这些事情,要是以前,我肯定会想,我是程序员和修电脑有啥关系. 但是自从进了事业单位, ...
- [Jenkins Git] 在Jenkins上拉代码总是失败,跑去本地看,提示输入用户名和密码,但是Jenkins上已经配置了正确的用户名和密码
git config --global credential.helper manager
- 第二天了,由于博主太分心了,看看就跑去研究了一下ssh和ufw以及nmap,现在急需记录一下啦,哈哈!
昨天看到了视频的ssh远程连接,因为我点电脑上装的是一个ubuntu的虚拟机,我根据视频看了一下,自己又试用了一下,我发现自己的ubuntu是能够远程到自己的Mac电脑上,一开始主要是因为自己不能连接 ...
- 爬虫--requests讲解
什么是requests? Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全 ...
随机推荐
- 07 如果再使用animateCC2018或者苹果系统使用animate时出现Uncaught ReferenceError: lib is not defined的错误
我刚开始还以为是模板造成的,换了个没有问题的模板就没有问题了,原来问题是这样. 点我预览,请看该文章
- 二叉树系列之Treap树
Treap是一棵拥有键值.优先级两种权值的树 struct node{ int size;//以这个结点为根的子树的结点总数量,用于名次树 int rank;//优先级 int key ...
- ubuntu20安装open4.4带扩展库
0查看当前版本安装 opencv_version 已经装了3.49 再装个4.4共存 1安装依赖库 sudo add-apt-repository "deb http://security. ...
- deepin系统编辑pdf文件的两个简单方法(终端命令行模式)
DEEPIN深度系统编辑PDF文件有时竟然超级简单好用,比WINDOWS系统需要单独下载一个PDF编辑软件的方法强多了,而且windows系统PDF编辑软件还有版权限制,各种作啊. 下面的两条命令,使 ...
- 阿里云下载ssl证书
"request合法域名"跟上面CA证书中申请的二级域名一致. Springboot增加证书 创建Springboot项目. 解压缩后,证书文件4375838_wechat.abc ...
- Oracle_20200416
PLSQL 新建普通用户 1.使用system登录 2.File-->NEW-->SQL WINDOW 3.执行语句 --创建用户 --create user 用户名 identified ...
- jmeter 正则表达式提取关联参数
自己也是初学,今天就正则表达式提取关联参数举几个例子. 理论: 1.提取单个字符串: 假如想匹配Web页面的如下部分:name = "file" value = "rea ...
- RKO队——冲刺随笔(5)
这个作业属于哪个课程 至诚软工实践F班 这个作业要求在哪里 第五次团队作业:项目冲刺 这个作业的目标 记录冲刺计划.要求包括当天会议照片.会议内容以及项目燃尽图(项目进度) 1.昨日进展 小程序大致完 ...
- 【Unity】Timeline探索记(4)第二个例子——动作特写/子弹时间
写在前面 这次例子参考这篇实现博文(附带项目下载),博文前面介绍非常具体,可惜后面特写轨实现代码不是按照我想要的标准四大件(data.mixer.clip.track)来组织的,所以这里我略过介绍,只 ...
- IO在指定目录建文件
path= "d:\\Project\\log\\log.txt"; File file = new File(path); //创建文件目录 if(!file.getParent ...