开发者社区 > 云原生 > 正文

关于machine-root子节点的数量的疑问?

使用Servlet集成的时候,看到每次向machine-root根节点叠加节点的时候,上下文的数量为什么不能超过2000(machine-root的根节点为什么不能超过2000个,超过2000个,贵方是直接不处理限流的)?

protected static Context trueEnter(String name, String origin) { Context context = contextHolder.get(); if (context == null) { Map<String, DefaultNode> localCacheNameMap = contextNameNodeMap; DefaultNode node = localCacheNameMap.get(name); if (node == null) { if (localCacheNameMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) { setNullContext(); return NULL_CONTEXT; } else { try { LOCK.lock(); node = contextNameNodeMap.get(name); if (node == null) { if (contextNameNodeMap.size() > Constants.MAX_CONTEXT_NAME_SIZE) { setNullContext(); return NULL_CONTEXT; } else { node = new EntranceNode(new StringResourceWrapper(name, EntryType.IN), null); // Add entrance node. Constants.ROOT.addChild(node);

                            Map<String, DefaultNode> newMap = new HashMap<String, DefaultNode>(
                                contextNameNodeMap.size() + 1);
                            newMap.putAll(contextNameNodeMap);
                            newMap.put(name, node);
                            contextNameNodeMap = newMap;
                        }
                    }
                } finally {
                    LOCK.unlock();
                }
            }
        }
        context = new Context(node, name);
        context.setOrigin(origin);
        contextHolder.set(context);
    }

其中 Constants.MAX_CONTEXT_NAME_SIZE 值为 2000

还有,在FQA中,文中提示不能调用者的数量不能过多,过多会导致内存暴涨,请问这个数量是否有个精准值?或者给个大概的值也是可以的,下面是相关QA的内容: Q: 怎么针对特定调用端限流?比如我想针对某个 IP 或者来源应用进行限流?规则里面 limitApp(流控应用)的作用? A: Sentinel 支持按来源限流,可以参考 基于调用关系的限流。注意 origin 数量不能太多,否则会导致内存暴涨,并且目前不支持模式匹配。

若 Web 应用使用了 Sentinel Web Filter,并希望对 HTTP 请求按照来源限流,则可以自己实现 RequestOriginParser 接口从 HTTP 请求中解析 origin 并注册至 WebCallbackManager 中。示例代码:

原提问者GitHub用户TenYearsIn

展开
收起
码字王 2023-05-19 19:11:22 95 0
1 条回答
写回答
取消 提交回答
  • 限制 entrance node、资源数目和 origin 数目的原因都是防止内存暴涨。对于 origin 数目,几十到几百个 origin 在正常情况下还是可以接受的(资源不是非常多的情况)。注意使用 Web Servlet 适配时应通过 UrlCleaner 来清理掉无用的或重复的(如 RESTful API)的资源。

    原回答者GitHub用户sczyh30

    2023-05-19 22:46:05
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载