V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
caiem
V2EX  ›  程序员

有个高并发接口,需要即时获取访问者的 ip 信息

  •  
  •   caiem · 2018-09-17 15:02:35 +08:00 · 3666 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前解决方案是查 ip 地址 mysql 数据库,然后即时返回.目前发现压力有点大. 还有啥更简单靠谱快速的解决方法. 目前考虑即再开启单独长驻内存的服务,将 ip 数据一次性读取内存,调用 rpc 方式供各个公司内部服务获取

    19 条回复    2018-09-18 10:12:07 +08:00
    opengps
        1
    opengps  
       2018-09-17 16:04:44 +08:00
    应用层使用内存读取方法没错

    看起来你的需求只是需要读取数据库,你可以多台机器,多台一模一样的数据库(数据库直接在机器内部也行,单独实例连接也行)
    lhy360121
        2
    lhy360121  
       2018-09-17 16:12:27 +08:00
    缓存。 比如用 redis
    lshero
        3
    lshero  
       2018-09-17 16:18:42 +08:00
    如果单纯为了返回 IP 归属地之类的信息不如参考使用 https://caddyserver.com/docs/http.geoip
    caiem
        4
    caiem  
    OP
       2018-09-17 16:33:45 +08:00
    @lshero 这个 ip 数据库我们内部有一定的维护及修改,没法直接用第三方
    hosaos
        5
    hosaos  
       2018-09-17 16:36:34 +08:00
    直接读到内存里 或者 redis 里
    PazuLee
        6
    PazuLee  
       2018-09-17 16:38:02 +08:00
    @caiem 是不是得分析下调用场景是否适合缓存?如果每次查询都不一样那还得考虑内存大小的问题。
    tempdban
        7
    tempdban  
       2018-09-17 16:39:00 +08:00 via Android
    ip 这种不是写个最长匹配表?参考路由查找下一跳 mac
    sampeng
        8
    sampeng  
       2018-09-17 18:50:10 +08:00
    你自己有 ip 库。。分分钟写一个 ip 查询的 rpc 服务就完事了。算法都很简单二分查找就足够快了(加载的时候排好序)。
    用动态语言,每访问一次查一次肯定慢死。
    redis 可以是可以。但也很奇怪。因为 ip 库一般是 ip 段。没法真正的 hash 查询。还是走了一圈前缀匹配。
    likuku
        9
    likuku  
       2018-09-17 20:24:17 +08:00
    mysql 也不是不可以,有个好东西叫 memcache 很早以前就有了
    xuanbg
        10
    xuanbg  
       2018-09-17 20:34:04 +08:00
    @sampeng 掩码了解一下
    rrfeng
        11
    rrfeng  
       2018-09-17 20:34:08 +08:00 via Android
    IP 库只有几兆大,可以加到内存里去。起个服务 RPC 也行。

    参考 ipip 的数据结构
    wb14123
        12
    wb14123  
       2018-09-17 20:39:28 +08:00 via Android
    字典树了解一下
    gaoyulong
        13
    gaoyulong  
       2018-09-17 23:31:43 +08:00 via Android
    我们也有这个需求,早期的时候直接调用外部服务,峰值高的时候直接把对方网站拖垮了
    Raymon111111
        14
    Raymon111111  
       2018-09-17 23:49:29 +08:00
    可以内存+ redis

    内存用 lru 类似的算法就行了
    Cbdy
        15
    Cbdy  
       2018-09-18 07:09:34 +08:00 via Android
    MySQL 放内存里跑
    opengps
        16
    opengps  
       2018-09-18 08:10:26 +08:00 via Android
    换个思路,给题主提个优化建议,存 ip 用数字 ip
    collinswang
        17
    collinswang  
       2018-09-18 09:13:37 +08:00
    难道不是和产品怼一下,要求把功能下放到二级菜单吗?
    reus
        18
    reus  
       2018-09-18 09:54:07 +08:00
    mysql 一样会把数据放内存。
    byteli
        19
    byteli  
       2018-09-18 10:12:07 +08:00 via Android
    看你们多大的 ip 数据,我之前有一千六百万行的 ip 数据大概不到 2 个 G,自己把信息预处理下抽出来写成个 raw 文件压缩成 200M 以方便程序载入。然后就是载入数据到 stl map 里内存直接查。因为与预处理过所以载入时间 5s 内,内存占用记不清了大概不到 500M。

    上面是资源消耗,还要看 qps 要求,因为我需要至少 3W 的 qps 所以直接把逻辑集成到调用者进程了。因为查询逻辑简单,所以如果做成 rpc 服务的话,准备几个核+不到 1G 内存应该就能逼近单机 RPC 框架的上限了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4053 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:18 · PVG 18:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.