长连接检测 监控的一点思考 java实现

大家好,我是烤鸭:

   怎么监控长链接服务器的稳定,除了探活服务之外,怎么保证长链接的收发正常,这篇文章考虑下这个。

问题来源

运营反馈部分直播间无法收到弹幕、点赞消息,第一时间进行复现,发现切换网络可以,但是不是所有人都可以。

怀疑是长连接服务器出问题了,重启后问题消失。

怎么监控呢,消息是否丢失?用户是否收到?

长链接实现

先谈谈实现方式,我们是基于nchan做的,之前也写过一篇文章。

https://blog.csdn.net/Angry_Mills/article/details/120068037

每次pub一条消息都会发布到redis,通过redis的发布订阅模式,不同的节点订阅后进行消息分发。

监控怎么加

客户端没收到消息的话,是建联的时候出错,还是建联成功一直没收到消息。

画一个简单的流程图,和监控可能加在哪里。

在这里插入图片描述

客户端加:
sub时候报错,进行错误上报,收到错误日志后进行报警。

服务端加:
发送到nchan服务器失败,进行报警。

发送到nchan服务器成功,redis中未有对应的消息,报警。

还有一种情况就是个人用户没收到消息,这种怎么监控。

建联了100个用户,只有1个用户没收到,网络原因?sub通道关闭了?nchan本身处理问题?

没什么好的方案,只能想办法记录当前建联了多少ip,以及发送了多少ip,进行比对,这种情况本身发生的几率不高。

服务端监控方案

pom中添加包

<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version>
</dependency>

定时任务进行建联+消息发送和接收校验,看看是否有丢消息的情况,同时还可以探活长连接服务器

public WebSocketClient webSocketClient(String url, String vid) {try {WebSocketClient webSocketClient = new WebSocketClient(new URI(url), new Draft_6455()) {@Overridepublic void onOpen(ServerHandshake handshakedata) {log.info("[websocket] 连接成功");}@Overridepublic void onMessage(String message) {log.info("[websocket:" + url + "] 收到消息={}", message);// 放到 ConcurrentHashMap 一会和发送后的进行对比websocketPool.put(PREFIX_RECV_MSG + url, message);}@Overridepublic void onClose(int code, String reason, boolean remote) {log.info("[websocket] 退出连接");}@Overridepublic void onError(Exception ex) {log.info("[websocket] 连接错误={}", ex.getMessage());String msg = "[" + url + "][sub error]" + ex.getMessage();// 发送报警消息}};webSocketClient.connect();// 记录 WebSocketClient 对象,发送后进行 closewebsocketPool.put(url, webSocketClient);return webSocketClient;} catch (Exception e) {e.printStackTrace();}return null;
}

验证方法

    public void init() {String uri = "localhost:8080";// 随机生成群组idString cStr = UUID.randomUUID().toString();String protocol = "ws://";if ("prod".equalsIgnoreCase(envValue)) {protocol = "wss://";}// 1. 初始化 websocketclientString subUrl = protocol + uri + "/subscribe?integer=" + cStr;webSocketClient(subUrl, cStr);// 2. pub 消息String pubUrl = "http://" + uri + "/pubsub?integer=" + cStr;String message = UUID.randomUUID().toString();// 2.1 pub一次验证一次,pub就是https发送nchan负载//pub(pubUrl, message);try {// 5秒后验证sub端是否和pub端结果一致Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}// 2.2 验证结果String subUrlMsg = PREFIX_RECV_MSG + protocol + uri + "/subscribe?integer=" + cStr;String recvMsg = (String) websocketPool.get(subUrlMsg);if (!message.equalsIgnoreCase(recvMsg)) {String msg = "[" + subUrl + "][sub error][message receive fail][send msg]=" + message+"[recv msg]=" + recvMsg;// 不一致的话,报警}// 4. 销毁WebSocketClient webSocketClient = (WebSocketClient) websocketPool.get(subUrl);webSocketClient.close();}

报警截图:

可以看到确实有丢消息的情况,不过概率不高。

在这里插入图片描述

总结

nchan虽然是基于nginx的,性能和效率好,不过确实有些黑盒,不太好监控和二次开发。

以后还得考虑换一套框架,进行更完善的api和监控机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq 启动失败 dump日志分析

大家好&#xff0c;我是烤鸭&#xff1a; rabiitmq 突然宕机&#xff0c;并且无法启动。同事反馈测试环境 rabbitmq 有一个节点突然掉了&#xff0c;并且无法启动。 现象 集群有一个节点宕机。 去对应的机器上执行启动命令 ./rabbitmq-server -detached发现进程不在&#x…

项目实战-药品采购系统-day01

目标&#xff1a;项目背景&#xff0c;需求&#xff0c;环境的搭建 难点&#xff1a;环境的搭建 1.学习方法&#xff1a; 一个项目&#xff1a;架构师、高级程序员、一般程序员 难度很大但是普通的程序员做很简单 所以自己对自己的定位要准确&#xff08;一般程序员&#xff09…

《深入理解Java虚拟机》-读书笔记(第一、第二部分)

大家好&#xff0c;我是烤鸭&#xff1a; 《深入理解Java虚拟机》-读书笔记&#xff08;第一、第二部分&#xff09;。 第一部分&#xff1a;走进Java 第1章 走进Java 1.1 概述 摆脱了硬件平台的束缚&#xff0c;实现了“一次编写&#xff0c;到处运行”的理想&#xff1b;…

BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)

Description 发生了火警&#xff0c;所有人员需要紧急疏散&#xff01;假设每个房间是一个N M的矩形区域。每个格子如果是.&#xff0c;那么表示这是一块空地&#xff1b;如果是X&#xff0c;那么表示这是一面墙&#xff0c;如果是D&#xff0c;那么表示这是一扇门&#xff0c;…

[vue]vue渲染模板时怎么保留模板中的HTML注释呢?

[vue]vue渲染模板时怎么保留模板中的HTML注释呢&#xff1f; <template comments>... </template>个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

redis设置为null问题

查看源码后发现&#xff0c;redis没有删除方法&#xff0c;本想给他设置为null,但是redis报错&#xff0c;所有仔细想了一下&#xff0c;发现redis提供了一个时间限制方法&#xff0c;所有可以让redis的时间限制为1s&#xff0c;就想当于删除redis中的这个K。 转载于:https://w…

nacos 返回 403 unknown user 太他么坑了 源码解析

大家好&#xff0c;我是烤鸭&#xff1a; nacos 真的是有点意思&#xff0c;有时候哪怕某个jar包版本冲突了都可能导致莫名其妙的错误&#xff0c;源码走一波吧。 当前版本 <dependencies><dependency><groupId>org.springframework.boot</groupId>&…

[vue] Vue.observable你有了解过吗?说说看

[vue] Vue.observable你有了解过吗&#xff1f;说说看 让一个对象可响应。Vue 内部会用它来处理 data 函数返回的对象。返回的对象可以直接用于渲染函数和计算属性内&#xff0c;并且会在发生改变时触发相应的更新&#xff1b;也可以作为最小化的跨组件状态存储器。个人简介 …

[vue] 你知道style加scoped属性的用途和原理吗?

[vue] 你知道style加scoped属性的用途和原理吗&#xff1f; 在标签上绑定了自定义属性&#xff0c;防止css全局污染 但是很多时候使用ui框架如果加scope就不能覆盖&#xff0c;这个时候一般写sass 会在最外层包裹该组件名的id 就可以不使用scoped 了个人简介 我是歌谣&#x…

研发效能提升 maven依赖扫描 版本统一 漏洞版本提醒

大家好&#xff0c;我是烤鸭&#xff1a; 整点干货&#xff0c;代码级别的版本统一&#xff0c;以及漏洞版本的扫描。 背景 两个方面吧。 项目整体的架构不统一&#xff0c;springboot/cloud 配置/注册中心也用的不统一&#xff0c;版本更是五花八门&#xff0c;怎么快速的找…

[vue] 你期待vue3.0有什么功能或者改进的地方?

[vue] 你期待vue3.0有什么功能或者改进的地方&#xff1f; 用尤大的话说就是各种速度提升n倍。我希望在依赖node_modules能够做出调整&#xff0c;文件数目太多&#xff0c;开启项目每次都要下载个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&…

Spring boot actuator端点启用和暴露

1.启用端点 默认情况下&#xff0c;除了shutdown端点是关闭的&#xff0c;其它的都是启用的。配置一个端点的启用&#xff0c;使用management.endpoint..enabled属性&#xff0c;下面的例子是启用shutdown端点&#xff1a; management.endpoint.shutdown.enabledtrue如果你个人…

java执行sql慢 navicat不慢 见鬼了

大家好&#xff0c;我是烤鸭&#xff1a; 有点意思的问题&#xff0c;代码提示接口超时(10s)&#xff0c;接口逻辑很简单&#xff0c;就一个sql查询。本来也想是sql慢&#xff0c;可是拿sql去Navicat执行下&#xff0c;一点不慢(50ms)。 环境 DB&#xff1a;SqlServer 连接池…

[vue] vue边界情况有哪些?

[vue] vue边界情况有哪些&#xff1f; 访问根实例、访问父组件、子组件个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

函数的基础

函数的初识&#xff1a; 封装一个功能。 def 函数名(): 函数体 函数的返回值&#xff1a;return 1,结束函数。 2&#xff0c;返回给执行者&#xff08;函数名()&#xff09;值。 return ----> None return 单个值----> 单个值 return 多个值----> &#xff08;多…

windows docker mongodb

大家好&#xff0c;我是烤鸭&#xff1a; 今天翻博客&#xff0c;发现4年前的一篇草稿&#xff0c;抽空给完善下。原本草稿写的是linux下mongo使用&#xff0c;还有java的一些api&#xff0c;现在就用容器实现下。 容器部署 官方网站&#xff1a; https://www.mongodb.com/ w…

[vue] 如何在子组件中访问父组件的实例?

[vue] 如何在子组件中访问父组件的实例&#xff1f; this.$parent拿到父组件实例 this.$children拿到子组件实例&#xff08;数组&#xff09;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

[vue] watch的属性用箭头函数定义结果会怎么样?

[vue] watch的属性用箭头函数定义结果会怎么样&#xff1f; 因为箭头函数默绑定父级作用域的上下文&#xff0c;所以不会绑定vue实例&#xff0c;所以 this 是undefind个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢…