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

websocket 限制QPS有效,但限制线程数无效

sentinel version : 1.3.0-GA

代码如下

@ServerEndpoint("/websocket/test/{requestId}") public class TestWebSocket {

private static final Logger logger = LoggerFactory.getLogger(TestWebSocket.class);

static {
    initFlowRules();
}

@OnOpen
public void OnOpen(@PathParam(value="requestId") String requestId, Session session) {

    Entry entry = null;
    try {
        entry = SphU.entry("HelloWorld");
        System.out.println("hello world");
    } catch (BlockException e1) {
        System.out.println("block!");
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}

/**
 * 连接关闭调用的方法
 */
@OnClose
public void onClose(Session session) {
    logger.info("close:{}", session.getId());
}

/**
 * 收到客户端消息后调用的方法
 *
 * @param message 客户端发送过来的消息
 * @param session 可选的参数
 * @throws InterruptedException
 */
@OnMessage
public void onMessage(String message, Session session) {

}

/**
 * 发生错误时调用
 *
 * @param session
 * @param error
 */
@OnError
public void onError(Session session, Throwable error) {
    LoggerUtil.warn(logger, error, "websocket onError,sessionId={},status={}", session.getId(), session.isOpen());
}

private static void initFlowRules(){

    List<FlowRule> rules = new ArrayList<FlowRule>();
    FlowRule rule1 = new FlowRule();
    rule1.setResource("HelloWorld");
    rule1.setCount(20);
    rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);
    rule1.setLimitApp("default");

    rules.add(rule1);
    FlowRuleManager.loadRules(rules);
}

}

原提问者GitHub用户jsjchai

展开
收起
码字王 2023-05-19 19:27:07 186 0
1 条回答
写回答
取消 提交回答
  • 似乎只有当连接建立就绪时,才会调用用@OnOpen注释的方法。因此,在这里使用线程计数模式是没有意义的,因为这只是一个回调,可能只需要一点时间。

    对于WebSocket来说,连接是持久连接,所以您可能只想限制处理消息或限制连接数量?您必须限制建立连接的并发线程数。

    原回答者GitHub用户sczyh30

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

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

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载