关于分布式查询方案的讨论
【关于分布式查询方案的讨论】
1、通过服务端缓存结果实现搜索
客户端C1向服务器发出【查询请求(key,GUID,IP,PORT)】,服务端S1把这个【请求(key,guid,ip,port)】插入到【查询请求队列(key,GUID,IP,PORT,inserttime)】里,然后“线程a”扫描【查询请求队列】,然后从【用户在线列表(IP,PORT)】里随机选出十个人把这个【请求(key,guid)】发送给他们.然后这些人查询自己本地的lucene索引,然后把前5个【查询结果(title,shortdesc,path,createdate,modifydate,guid)】发送给服务器,服务器里的“线程b”收到查询结果后,先放入【查询结果缓存(用hashtable来做,key是guid,value是一个inerttime和ilits组成的结构,list里的item和查询结果的结构一样)】,如果一个guid的结果数目已经有50个或者从now减去inerttime大于【结果超时时间(可配置)】,就从【查询请求队列】里通过这个guid找到当初请求人的IP和port,把这个结果发给查询请求者,同时通过guid删除【查询请求队列】和【查询结果缓存】里的相关数据。"线程c"扫描【查询请求队列】通过now和inerttime比较,删除超时的查询请求。
缺点:
随机选择的这10个人也许都没有这个key的结果
服务器缓存结果的压力很大
所有的客户端和服务端要保持一个TCP长连接,或者UDP模仿的可靠连接,比较浪费资源
补充:
服务端和客户端通讯可用socket也可以用remoting。
客户端发出查询后可能会等好长时间,所以要做成异步模式,等查询结果出拉之后以提示的方式报告给用户。
2、进行P2P搜索
客户端先从服务器的在线列表里随机获取10个在线人员的IP和端口,通过服务器辅助进行UDP打洞,然后给这10个客户端发起查询请求,返回的结果缓存在本地队列达到50条或者超时之后,显示出来。
缺点:有的路由设备的NAT类型不支持UDP穿透,所以有时候这个方法会不灵
补充:关于UDP打洞的原理网上有好多介绍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构