iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >mongo的tickets被耗尽导致卡顿问题怎么解决
  • 348
分享到

mongo的tickets被耗尽导致卡顿问题怎么解决

2023-07-05 23:07:09 348人浏览 泡泡鱼
摘要

这篇文章主要介绍了monGo的tickets被耗尽导致卡顿问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mongo的tickets被耗尽导致卡顿问题怎么解决文章都会有所收获,下面我们一起来看看吧。t

这篇文章主要介绍了monGo的tickets被耗尽导致卡顿问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mongo的tickets被耗尽导致卡顿问题怎么解决文章都会有所收获,下面我们一起来看看吧。

tickets是什么

为了解决这个问题,我们首先要明白ticktes是什么,其实网上基本都说的一知半解,没有一个能说明白的,但是有一个查询tieckts消耗情况的mongo命令:

db.serverStatus().wiredTiger.concurrentTransactions

查询结果:

{"write" : {"out" : 0,"available" : 128,"totalTickets" : 128},"read" : {"out" : 1,"available" : 127,"totalTickets" : 128}}

可以看到tickets分为读写两种,那ticktets到底是什么呢,我们根据这个查询命令,其实大致可以猜测认为是当前同时存在的事务数量。

也就是mongo限制了同时进行的事务数。

早期因为不知道tickets到底是什么意思,尝试过很多思路错误的优化,所以解决问题,最好还是能弄明白问题本身,才能对症下药。

思考历程

在众多数据库卡顿的经历中,曾有一次因为RabbitMQ导致的数据库卡顿,原因是一小伙伴在请求的过滤层加了一个发送MQ的逻辑,但是没有进行限制,导致每次只有有接口被调,都会去发布一个mq消息,由于过高的并发导致rabbitmq不堪重负,倒是让人想不明到的是mq卡的同时,数据库也卡住了。

一开始以为是因为消息过多,导致消费者疯狂消费,压垮了数据库,其实不存在这个问题,因为我们的mq配置单个消费者机器是串行的,也就是同一台机器同一时间只会消费同一个消息队列的一条消息,所以并不会因为消息的多给数据库带来压力,只会堆积在mq集群里。所以这次其实没有找到mq卡顿导致mongo卡顿的原因。

我们接入的几家第三方服务,比如给我们提供IM消息服务的融云,每次他们出现问题的时候,我们也会出现数据库卡顿,并且每次时间出奇的一直,但也始终找不到原因。

起初经过对他们调用我们接口情况进行分析,发现每次他们出问题时,我们收到的请求会倍增,以为是这个原因导致的数据库压力过大,并且我们基于redis和他们回调的流水号进行了拦截,拦截方式如下:

  • 当请求过来时从Redis中查询该笔流水号状态,如果状态为已完结,则直接成功返回

  • 如果查询到状态是进行中,则抛异常给第三方,从而让他继续重试

  • 如果查询不到状态,则尝试设置状态为进行中并设置10秒左右的过期时间,如果设置成功,则放到数据库层面进行数据处理;如果设置失败,也抛异常给第三方,等待下次重试

  • 等数据库曾处理完成后,将redis中的流水号状态改为已完结。

避免重复请求给我们带来的数据库的压力。这其实也算是一部分原因但还是不算主要原因。

引起mongo卡顿的还有发布版本,有一段时间隔三差五发布版本,就会出现卡顿,但是查看更新的代码也都是一些无关痛痒理论上不会引起问题的内容。

后来发现是发布版本时每次同时关闭和启动的机器从原来的一台改成了两台(一台一台发布太慢,所以运维改成了两台两台一起发),感觉原因应该就在这里,后来想到会不会和优雅关闭有关,当机器关闭时仍然有mq消费者以及内置循环脚本在执行,当进程杀死时,会产生大量需要立马回滚的事务,从而导致mongo卡顿。

后来经过和运维小伙伴的沟通发现,在优雅关闭方面确实存在问题,他们关闭容器时会小容器内的主进程发一个容器即将关闭的信号,然后等待几十秒后,如果主进程没有自己关闭,则会直接杀死进程。

为此我们需要在程序中实现对关闭信号的监听,并实现优雅关闭的逻辑,在spring中,我们可以通过spring的时间拿到外部即将关闭的信号:

@Volatileprivate var consumeSwitch = true@EventListenerfun close(event: ContextClosedEvent){consumeSwitch = falselogger.info("----------------------rabbitmq停止消费----------------------")}

可以通过如上方式,对系统中的mq消费者或者其他内置程序进行优雅关停控制,对优雅关闭问题优化后,服务器关闭重启导致的数据库卡顿确实得到了有效解决。

上面的融云问题优化过后,后来融云再次卡顿的时候,还是会出现mongo卡顿,由此可见,肯定和第三方有关,但上面说的问题肯定不是主要原因。

后来我看到我们调用第三方的逻辑很多都在@Transactional代码块中间,后来去看了第三方sdk里的逻辑,其实就是封装了一个Http请求,但是http请求的请求超时时间长达60秒,那就会有一个问题,如果这个时候第三方服务器卡顿了,这个请求就会不断地等,知道60s超时,而由于这个操作是在事务块中,意味着这个事务也不会commit掉,那等于这个事务所占用的tickets也一直不会放掉,至此根本原因似乎找到了,是因为事务本身被卡住了,导致tickets耗尽,从而后面新的事务全部都在等待状态,全部都卡住了。

其实这次找的原因,同样也可以解释前面mq卡顿导致的数据库卡顿,因为同样有大量的发送mq的操作在事务块中,因为短时间疯狂发mq,导致mq服务端卡顿,从而导致发mq的操作出现卡顿,这就会出现整个事务被卡住,接着tickets被消耗殆尽,整个数据库卡顿。

找到确定问题后就好对症下药了,第三方的问题由于我们不能保证第三方的稳定性,所以当第三方出现问题时的思路应该是进行服务降级,允许部分功能不可用,确定核心业务不受影响,我们基于java线程池进行了同步改异步处理,并且由于第三方的工作是给用户推送im消息,所以配置的舍弃策略是当阻塞队列堆积满之后,将最老的进行丢弃。

而如果是mq导致的这种情况,我们这边没有进行额外的处理,因为这种情况是有自身的bug导致的,这需要做好整理分享工作,避免再次出现这样的bug。

//自己实现的runnableabstract class RonGCloudRunnable(private val taskDesc: String,private val params: Map<String, Any?>) : Runnable {override fun toString(): String {return "任务名称:${taskDesc};任务参数:${params}"}}//构建线程池private val rongCloudThreadPool = ThreadPoolExecutor(externalProps.rongCloud.threadPoolCoreCnt, externalProps.rongCloud.threadPoolMaxCnt, 5,TimeUnit.MINUTES, LinkedBlockingQueue<Runnable>(externalProps.rongCloud.threadPoolQueueLength),RejectedExecutionHandler { r, executor ->if (!executor.isshutdown) {val item = executor.queue.poll()logger.warn("当前融云阻塞任务过多,舍弃最老的任务:${item}")executor.execute(r)}})//封装线程池任务处理方法fun taskExecute(taskDesc: String, params: Map<String,Any?>, handle: ()-> Unit){rongCloudThreadPool.execute(object :RongCloudRunnable(taskDesc, params){override fun run() {handle()}})}//具体使用taskExecute("发送消息", mapOf("from_id" to fromId,"target_ids" to targetIds,"data" to data,"is_include_sender" to isIncludeSender)){sendMessage(BatchSendData(fromId, targetIds, data, isIncludeSender))}

关于“mongo的tickets被耗尽导致卡顿问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“mongo的tickets被耗尽导致卡顿问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: mongo的tickets被耗尽导致卡顿问题怎么解决

本文链接: https://www.lsjlt.com/news/356239.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决mongo的tickets被耗尽导致卡顿问题
    目录tickets是什么思考历程总结近一年来,项目线上环境的mongo数据库出现多次tickets被耗尽,导致数据库卡顿,并且都是突然出现,等待一段时间后又能自动恢复。 为了解决这个问题,我们进行了长期的探索和研究,先后...
    99+
    2023-04-08
    mongo tickets tickets被耗尽 tickets卡顿
  • mongo的tickets被耗尽导致卡顿问题怎么解决
    这篇文章主要介绍了mongo的tickets被耗尽导致卡顿问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mongo的tickets被耗尽导致卡顿问题怎么解决文章都会有所收获,下面我们一起来看看吧。t...
    99+
    2023-07-05
  • Windows11上Microsoft Edge导致电池耗尽怎么解决
    这篇文章主要介绍“Windows11上Microsoft Edge导致电池耗尽怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Windows11上Micros...
    99+
    2023-04-29
    windows11
  • Linux系统inodes资源耗尽问题怎么解决
    今天就跟大家聊聊有关Linux系统inodes资源耗尽问题怎么解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.inodes介绍Linux系统下文件数据储存在”块”中,文件的元信...
    99+
    2023-06-28
  • 完美解决mac因为中文输入法导致的卡顿问题
            我机器是M1 pro,偶现卡顿问题,后来发现是自带中文输入法导致的。使用活动监视器是可以关闭进程解决。但是卡顿的时候操作活动监视器关闭进程会很卡顿,所以写了一个脚本,直接kill掉对应进程。         没代码基础的,需...
    99+
    2023-10-24
    macos
  • qt多线程导致界面卡顿怎么解决
    当使用Qt多线程导致界面卡顿时,可以尝试以下几种解决方法:1. 使用QThread类:Qt提供了QThread类来实现多线程,确保在...
    99+
    2023-10-18
    qt
  • 怎么解决电脑卡顿问题
    这篇文章主要介绍怎么解决电脑卡顿问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!重新安装系统很多人都应该知道,电脑用久了太卡了就重新安装一个系统,这时使用电脑必须要懂得常识。重新安装电脑系统的方法也有多种,我们常用...
    99+
    2023-06-28
  • ADO Error导致的问题怎么解决
    这篇文章主要介绍“ADO Error导致的问题怎么解决”,在日常操作中,相信很多人在ADO Error导致的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO Error导致的问题怎么解决”的疑...
    99+
    2023-06-17
  • 怎么解决电脑卡顿、变慢的问题
    这篇文章主要介绍了怎么解决电脑卡顿、变慢的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。           ...
    99+
    2023-06-28
  • qt串口接收大量数据导致卡顿怎么解决
    如果Qt串口接收大量数据导致卡顿,可以尝试以下几种解决办法:1. 优化串口接收代码:确保串口接收代码是高效的,可以使用Qt提供的异步...
    99+
    2023-09-22
    qt
  • 美国服务器怎么解决卡顿问题
    解决美国服务器卡顿问题的方法:1、更新或升级美国服务器配置资源,例如升级服务器带宽配置,提高网站速度;2、升级美国服务器内存和处理器,增加服务器等承受能力;3、对美国服务器网站的代码结构以及页面大小进行优化压缩。具体内容如下:升级服务器带宽...
    99+
    2024-04-02
  • 怎么解决韩国服务器访问卡顿的问题
    解决韩国服务器访问卡顿问题的方法:1、如果是网络带宽不够用所造成的,增加带宽就能解决;2、如果是服务器受到攻击所造成的,开启DDOS防火墙和CC防火墙,进行流量清洗;3、如果是网络出现波动,高峰期拥堵所造成的,租用独享带宽的服务器能使网站更...
    99+
    2024-04-02
  • 怎么解决异步任务所导致的问题
    这篇文章主要介绍“怎么解决异步任务所导致的问题”,在日常操作中,相信很多人在怎么解决异步任务所导致的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决异步任务所导致的...
    99+
    2024-04-02
  • hover导致位置错乱的问题怎么解决
    这篇文章主要介绍了hover导致位置错乱的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇hover导致位置错乱的问题怎么解决文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
  • Android中怎么解决 ListView与getView调用卡顿问题
    本篇文章给大家分享的是有关Android中怎么解决 ListView与getView调用卡顿问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android ListView与...
    99+
    2023-05-30
    android listview getview
  • 怎么解决Mysql tools中orztop导致的错误问题
    这篇文章主要介绍“怎么解决Mysql tools中orztop导致的错误问题”,在日常操作中,相信很多人在怎么解决Mysql tools中orztop导致的错误问题问题上存在疑惑,小编查阅了各式资料,整理出...
    99+
    2024-04-02
  • MsSQ数据导入到Mongo的默认编码乱码问题怎么解决
    本篇内容主要讲解“MsSQ数据导入到Mongo的默认编码乱码问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MsSQ数据导入到Mongo的默认编码乱码...
    99+
    2024-04-02
  • Android进程运行中权限被收回导致关闭的问题解决
    流程如图: MainActivity 跳转至 MainActivity2 再跳转至 MainActivity3MainActivity3 跳转至 设置,收回权限 ...
    99+
    2024-04-02
  • nginx上传请求体太大导致的问题怎么解决
    这篇文章主要讲解了“nginx上传请求体太大导致的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nginx上传请求体太大导致的问题怎么解决”吧!1.原因GitLab  ...
    99+
    2023-06-04
  • 怎么解决ubuntu12.04卡死的问题
    这篇文章主要介绍“怎么解决ubuntu12.04卡死的问题”,在日常操作中,相信很多人在怎么解决ubuntu12.04卡死的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决ubuntu12.04卡死...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作