• 关于分布式查询方案的讨论


    【关于分布式查询方案的讨论】
    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打洞的原理网上有好多介绍

  • 相关阅读:
    jQuery年月日(生日)选择器
    jQuery在线选座订座(高铁版)
    jQuery在线选座订座(影院篇)
    Failed to Attach to Process ID Xcode 解决办法
    C++ Virtual详解
    消除Xcode 5中JosnKit类库的bit masking for introspection of objective-c 警告
    常见创建项目编译运行问题汇总
    KVC的用法
    xcode在调试时无法查看变量值
    ObjC的initialize和init
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/690558.html
Copyright © 2020-2023  润新知