目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 1.背景 对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外.尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路. 2.表锁导…
看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且直觉告诉我们,这是不可能的,就一直没有在意,直到后来真的发现了一个用户确实是42亿,当时我们整个公司都震惊了,如果有大量用户是这样的情况,公司要亏损几十万,我们的老大告诉我们,肯定是什么地方数据溢出的,最后我们一帮人,疯了似的查代码,发现…… 如果按照正常的程序逻辑走下去,代码是完全没问题,但是我发…
Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额. 在高并发场景下,提供了保证线程安全的对象.方法.比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好.线程安全的StringBuilder取代String.StringBuffer等等(Java在多线程这块实现是非常优秀和成熟的). Java…
本文来自网易云社区 作者:张伟 关于HashMap在并发场景下的问题有很多人,很多公司遇到过!也很多人总结过,我们很多时候都认为这样都坑距离自己很远,自己一定不会掉入这样都坑.可是我们随时都有就遇到了这样都问题,坑一直都在我们身边.今天遇到了一个非线程安全对象在并发场景下使用的问题,通过这个案例分析HashMap 在并发场景下使用存在的问题(当然在这个案例中还有很多问题值得我们去分析,值得大家引以为戒.)通过分析问题产生都原因,让我们今后更好远离这个BUG. 代码如图所示,大家都应该知道Hash…
package xxx; import java.sql.Timestamp; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; /** * 高并发场景下System.currentTimeMillis()的性能问题的优化 * <p><p> * System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100…
在项目中使用HttpClient可能是很普遍,尤其在当下微服务大火形势下,如果服务之间是http调用就少不了跟http客户端找交道.由于项目用户规模不同以及应用场景不同,很多时候可能不需要特别处理也.然而在一些高并发场景下必须要做一些优化. 项目是快递公司的快件轨迹查询项目,目前平均每小时调用量千万级别.轨迹查询以Oracle为主要数据源,Mongodb为备用,当Oracle不可用时,数据源切换到Mongodb.今年菜鸟团队加入后,主要数据迁移到了阿里云上,以Hbase为主要存储.其中Hbase…
高并发场景下System.currentTimeMillis()的性能问题的优化 package cn.ucaner.alpaca.common.util.key; import java.sql.Timestamp; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; /** * 高并发场景下System.currentTimeMillis()的性能问题的优化 * <p><p>…
C++高并发场景下读多写少的解决方案 概述 一谈到高并发的解决方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读多写少的场景出发,探讨其解决方案,以其更好的实现高并发. 不同的业务场景,读和写的频率各有侧重,有两种常见的业务场景: 读多写少:典型场景如广告检索端.白名单更新维护.loadbalancer 读少写多:典型场景如qps统计 本文针对读多写少(也称一写多读)场景…
概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读多写少的场景出发,探讨其解决方案,以其更好的实现高并发.不同的业务场景,读和写的频率各有侧重,有两种常见的业务场景: 读多写少:典型场景如广告检索端.白名单更新维护.loadbalancer 读少写多:典型场景如qps统计 本文针对读多写少(也称一写多读)场景下遇到的问题进行分析,并探讨一种合适的解…
参考链接:并发场景下HashMap死循环导致CPU100%的问题…
本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据”和相对“高并发”场景的一些应对策略,部分措施并没有经过严格的对比测试和原理分析,如有错漏欢迎各种批评指教.减少查询的影响结果集,避免出现全表扫描.影响结果集是SQL优化的核心.影响结果集不是查询返回的 本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发…
查询了下Mysql 关于高并发的处理的资料,在这记录一下. 高并发大多的瓶颈在后台数据逻辑处理,在存储,mysql的正常的优化方案如下: 1.代码中sql语句优化 2.数据库字段优化,索引优化 3.加缓存,redis/memcache等 4.主从,读写分离 5.分区表 6.垂直拆分,解耦模块 7.水平切分 点评: 1.方法1&方法2是最简单,也是提升效率最快的方式.也许有人说这两点你已经做的很好了,你的每条语句都命中了索引,是最高效的.但是你是否是为了你的sql达到最优而去建索引,而不是从整个业…
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 0. 内容提纲 运行环境 部署MGR A&B 部署MGR A.B之间的复制通道 几个注意事项 如何在多个数据中心部署多套MySQL MGR集群以便快速切换. 在金融应用场景下,经常会要求在同城多中心部署高可用数据库架构,以期实现在发生故障时能达到快速切换的目标. 在同一个数据中心内,可以部署MGR集群,就可以实现快速灵活切换. 而即便是在同城,跨数据中心时,网络条件好的话,延迟可能也在 1ms 之内.这种网络条件下,如…
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 如何在多个数据中心部署多套MGR集群,并实现故障快速切换. 上篇文章介绍了如何在多数据中心部署多套MGR集群,并构建集群间的复制通道.这样一旦主AZ不可用时,在校验完数据后,就可以切换到备用AZ的MGR集群,非常方便. 本文我们继续深入介绍如何利用 Async Replication Auto failover 实现故障自动转移的. 1.什么是Async Replication Auto failover 从MySQL…
一.前言 System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法, 有时不得不使用,比如生成wokerId.打印日志什么的,在高并发情形下肯定存在性能问题的,但怎么做才好呢? System.currentTimeMillis()之所以慢是因为 去跟系统打了一次交道.那什么快?内存!如果该方法从内存直接取数,那不就美滋滋了. 二.代码实现 public class SystemClo…
问题出现是这样的,用node写爬虫, 之前每条数据都是await插入,并且是阻塞的,后来改成了非阻塞,可以并行插入操作,结果一直找不到原因. 后来在日志中找到了 too many connections,分析如下: 用nodejs写爬虫的时候,使用了类似这样的函数 let conn = null; try{ conn = await pool.getConnection(); await conn.begin() let rst = await .conn.query('xxxx',params…
1.背景 我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别.使用了httpclient来完成业务.之前因为qps上不去,就看了一下业务代码,并做了一些优化,记录在这里. 先对比前后:优化之前,平均执行时间是250ms:优化之后,平均执行时间是80ms,降低了三分之二的消耗,容器不再动不动就报警线程耗尽了,清爽~ 2.分析 项目的原实现比较粗略,就是每次请求时初始化一个httpclient,生成一个httpPost对象,执行,然后从返回结果取出entity,保存成一个字…
一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可以看出,在观察周期里: 平均每10分钟Young GC次数66次,峰值为470次: 平均每10分钟Full GC次数0.25次,峰值5次: 可见Full GC非常频繁,Young GC在特定的时段也比较频繁,存在较大的优化空间.由于对GC停顿的优化是降低接口的P99时延一个有效的手段,所以决定对该核…
最近在和小伙伴们做充电与通信程序的架构迁移.迁移前的架构是,通信程序负责接收来自充电集控设备的数据实时数据,通过Thrift调用后端的充电服务,充电服务收到响应后放到进程的Queue中,然后在管理线程的调度下,启动多线程进程数据处理. 随着业务规模的不断扩大和对系统可用性的逐步提高.现在这个架构存在很多的问题,比如: 1.充电服务重启,可能会丢数据. 2.充电服务重启会波及影响通信服务. 3.充电服务与通信服务面对的需求和变化是不一样,强依赖的架构带来很多的问题. 为了解决上述的这些问题,项目组…
三.算法的优化 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写..使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效.与临时表一样,游标并不是不可使用.对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时.在结果集中包括“合计”的例程通常要比使用游标执行的速度快.如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好.…
转自:https://blog.csdn.net/zzaric/article/details/80641786 应用场景如下: 公司内有多个业务系统,由于业务系统内有向用户发送消息的服务,所以通过统一消息系统对外暴露微服务接口供外部业务系统调用,所有公司内业务系统的消息(短信,APP,微信)推送都由统一消息系统去推送,短信推送需要走外部短信通道商去发送短信,APP和微信走内部系统的push服务器,但是不管是短信通道商还是内部push服务器都会有每秒上限的控制.在这假设n/s条. 以下是统一消息…
使用场景: 在list数据进来之后使用安全数组    Lists.newCopyOnWriteArrayList() 进行了   parallelStream  并行处理,在接口中进行了登录者信息接口的调用,获取方式是从当前登录的requst中获取用户携带的session信息,在并行处理的过程中出现调用NPE异常信息. 问题排查: public static ServletRequestAttributes getRequestAttributes() { RequestAttributes a…
关于WEB金融系统中的提现安全问题很多人没有深入思想,导致有漏洞,常常会遇到有些人遇到被攻击到导资金损失的麻烦,     其实要彻底解决重复并发请求 导致重复提现问题,是需要花点心思的,并没有看起来的那么 简单,即使是最直观简单的语句都是有漏洞的比如: -----------------------------------------场景1-------------------- 发现很多朋友的项目一个漏洞:先为一账户充值100元,然后瞬间发送10次提现请求(都是提现100,提现接口是有做余额不…
这里我借鉴了网上其他大佬的观点: 一:高并发带来的挑战 原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户. 吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100ms,我们有10台Web服务器,每台给它最大连接数500. 理想化计算方式: 10 * 500/0.1 = 50000 难道我们真的有处理5万并发? 不然.高并发场景下,Web服务器打开了越多的连接进程,CPU切换上下文的也越多.会增加CPU的压力,导致CPU业务请求响应耗时 会超出预期很多.可能你…
在做产品的某个核心模块的性能优化时,发现压到100并发时应用服务器的CPU就飙升至90%以上,50并发以后TPS就基本定格在一个数值上.使用性能监视器收集应用服务器的数据,发现每秒的.NET CLR Exceptions数据特别高,且异常数量与CPU使用率的曲线呈正比例的关系. 并发测试的业务结果是正确的,LoadRunner也没有发现大量的错误,那么大量的内部异常从哪儿来的呢?使用windbg输出所有异常信息,查阅Log日志. 打开windbg,attach到指定进程,设置捕获异常并输出的命令…
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象,虽然现在看起来不太实际,但是随着技术的进步,相信五年.十年之后都会实现的. 不知道是谁提起了在高并发环境下如何构建缓存服务,结果一路停不下来了!! 缓存特征 (1)命中率:命中数/(命中数+没有命中数) (2)最大元素(空间):代表缓存中可以存放的最大元素的数量,一旦缓存中元素的数量超过这个值,或…
背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信息",用户只会触发一次请求,查询自己的信息,但是多个人同时这样做就会产生多次数据库连接.为了减少连接,需要在JAVA服务端进行合并请求,把多个"个人信息"查询接口,合并为批量查询多个"个人信息"接口,然后以个人信息在数据库的id作为Key返回给上游系统或者页面…
背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信息",用户只会触发一次请求,查询自己的信息,但是多个人同时这样做就会产生多次数据库连接.为了减少连接,需要在JAVA服务端进行合并请求,把多个"个人信息"查询接口,合并为批量查询多个"个人信息"接口,然后以个人信息在数据库的id作为Key返回给上游系统或者页面…
一.序言 目前企业级主流使用的Java版本是8,垃圾回收器支持手动修改为G1,G1垃圾回收器是Java 11的默认设置,因此G1垃圾回收器可以用很长时间,现阶段垃圾回收器优化意味着针对G1垃圾回收器优化. 为了简化讨论,下面假设针对4C/16G物理机器进行优化. 二.G1概览 (一)了解G1 1.最大堆大小 G1管理的最大堆大小为64G.每个Region的大小通过-XX:G1HeapRegionSize来设置,大小为1~32MB,默认最多可以有2048个Region,G1能管理的最大堆内存是32…