一个S2S通信中的同步、异步问题的解决
最近在搞Openfire S2S时遇到了一个数据通信时的同步与异步问题。具体描述如下:
OF中的基本通信结构如下:
客户端与服务器的通信是同步的,服务器与服务器之间的通信却是异步的:客户端发送一个请求后就会阻塞一段时间,等待服务器的响应;服务器之间则采用消息通知的方式异步交流数据。
所以会出现下面这种情况:
客户端发送消息给服务器A,消息经入口路由到相应的功能模块进行处理,而此时需要从B服务器中获取一些额外的数据,比如验证发送上来的账号是否在另外的服务器有注册。一般情况下数据在本地的话就直接查找处理再给用户返回就行,但在其它服务器时直接返回就会出现结果错误或不完整,不返回则造成客户端超时。
处理这种情况的方法就是:接收到客户端的请求后,服务器A发送消息给B查询数据,同时将客户端的请求阻塞一个小的时间段(保证客户端不超时),等B返回数据后再继续执行下面的逻辑。(看了OF代码才明白了)
以查询是否为注册用户为例,OF是如下实现的:
再来看看外层路由是如何捕获查询结果消息,并交给相应的业务逻辑处理的:
结合上面的那段代码,就可以看出OF中是如何实现这个功能的了。
但这种做法的缺点也是很明显的:
1.需要原进程阻塞一个固定时间
2.需要每个涉及到同步、异步问题的地方都有一个接收结果的机制
所以可以针对以上两点做些改进。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述