精华内容
下载资源
问答
  • 2020-10-30 19:09:29

    增加线程池中线程池的个数,同时需要增强硬件。

    更多相关内容
  • 常用的网站性能测试指标有:并发数、响应时间、吞吐、性能计数器等。 1、并发并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。 2、响应时间 响应时间是一个系统最重要的指标之一,它的...
  • 本篇主要讲解的是前阵子的一个压测问题.那么就直接开门见山 可能有的朋友不并不知道forceTransactionTemplate这个是干嘛的,首先这里先普及一下,在Java中,我们一般开启事务就有三种方式 XML中根据service及方法名...
  • 请实现如下的函数(发请求的函数可以直接使用fetch...fetch 函数返回的是一个promise,promise对象在实例化的时候就已经开始执行了。 简易实现 function fetch(url) { // 模拟接口请求 return new Promise(resolve
  • 下面小编就为大家带来篇PHP接口并发测试的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做参考。一起跟随小编过来看看吧
  • 接口合并提升并发量

    2021-11-28 15:39:05
    在高并发接口设计的过程中有一个技巧就是可以采用接口合并的策略。它的前提是要求下游接口要提供批量的接口。 首先为每一个请求分配一个唯一的标识号来表示该次请求,然后将请求入队列,通过定时任务每隔10ms去...

        在高并发接口设计的过程中有一个技巧就是可以采用接口合并的策略。它的前提是要求下游接口要提供批量的接口。

       首先为每一个请求分配一个唯一的标识号来表示该次请求,然后将请求入队列,通过定时任务每隔10ms去队列里面拉一批请求,然后组装成批量请求的参数来发请求,然后收到结果以后,再根据唯一标识来将结果赋予对应的请求。即可以完成降低io请求次数的目的,提高并发性。

    展开全文
  • 如何设置高并发接口一并发队列的选择二、请求接口的合理设计三、高并发下的数据安全3.1 超发的原因3.2 悲观锁思路3.3 FIFO队列思路3.4 乐观锁思路并发队列的选择Java的并发包提供了三常用的并发队列实现,...

    如何设置高并发接口

    一、并发队列的选择

    二、请求接口的合理设计

    三、高并发下的数据安全

    3.1 超发的原因

    3.2 悲观锁思路

    3.3 FIFO队列思路

    3.4 乐观锁思路

    一、并发队列的选择

    Java的并发包提供了三个常用的并发队列实现,分别是:ArrayBlockingQueue、ConcurrentLinkedQueue 和 LinkedBlockingQueue 。

    ArrayBlockingQueue是初始容量固定的阻塞队列,我们可以用来作为数据库模块成功竞拍的队列,比如有10个商品,那么我们就设定一个10大小的数组队列。

    ConcurrentLinkedQueue使用的是CAS原语无锁队列实现,是一个异步队列,入队的速度很快,出队进行了加锁,性能稍慢。

    LinkedBlockingQueue也是阻塞的队列,入队和出队都用了加锁,当队空的时候线程会暂时阻塞。

    在请求预处理阶段,由于我们的系统入队需求要远大于出队需求,一般不会出现队空的情况,所以我们可以选择

    ConcurrentLinkedQueue来作为我们的请求队列实现

    二、请求接口的合理设计

    一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口。

    通常静态HTML等内容,是通过CDN的部署,一般压力不大,核心瓶颈实际上在后台请求接口上。这个后端接口,必须能够支持高并发请求,同时,非常重要的一点,必须尽可能“快”,在最短的时间里返回用户的请求结果。为了实现尽可能快这一点,接口的后端存储使用内存级别的操作会更好一点。仍然直接面向MySQL之类的存储是不合适的,如果有这种复杂业务的需求,都建议采用异步写入。当然,也有一些秒杀和抢购采用“滞后反馈”,就是说秒杀当下不知道结果,一段时间后才可以从页面中看到用户是否秒杀成功。但是,这种属于“偷懒”行为,同时给用户的体验也不好,容易被用户认为是“暗箱操作”。

    三、高并发下的数据安全

    我们知道在多线程写入同一个文件的时候,会存现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的)。如果是MySQL数据库,可以使用它自带的锁机制很好的解决问题,但是,在大规模并发的场景中,是不推荐使用MySQL的。秒杀和抢购的场景中,还有另外一个问题,就是“超发”,如果在这方面控制不慎,会产生发送过多的情况。我们也曾经听说过,某些电商搞抢购活动,买家成功拍下后,商家却不承认订单有效,拒绝发货。这里的问题,也许并不一定是商家奸诈,而是系统技术层面存在超发风险导致的。

    3.1 超发的原因

    假设某个抢购场景中,我们一共只有100个商品,在最后一刻,我们已经消耗了99个商品,仅剩最后一个。这个时候,系统发来多个并发请求,这批请求读取到的商品余量都是99个,然后都通过了这一个余量判断,最终导致超发。(同文章前面说的场景),在下面的这个图中,就导致了并发用户B也“抢购成功”,多让一个人获得了商品。这种场景,在高并发的情况下非常容易出现。

    57c4baf0ff913b46402bf4480fc3050e.png

    3.2 悲观锁思路

    解决线程安全的思路很多,可以从“悲观锁”的方向开始讨论。

    悲观锁,也就是在修改数据的时候,采用锁定状态,排斥外部请求的修改。遇到加锁的状态,就必须等待。

    28618ce0fd80dceb14b85879855e2d91.png

    虽然上述的方案的确解决了线程安全的问题,但是,别忘记,我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接数被耗尽,系统陷入异常。

    3.3 FIFO队列思路

    那好,那么我们稍微修改一下上面的场景,我们直接将请求放入队列中的,采用FIFO(First Input First Output,先进先出),这样的话,我们就不会导致某些请求永远获取不到锁。看到这里,是不是有点强行将多线程变成单线程的感觉哈。

    6844903974206701581

    08087e191c94728fc3eba3ef1e76d73f.png

    然后,我们现在解决了锁的问题,全部请求采用“先进先出”的队列方式来处理。那么新的问题来了,高并发的场景下,因为请求很多,很可能一瞬间将队列内存“撑爆”,然后系统又陷入到了异常状态。或者设计一个极大的内存队列,也是一种方案,但是,系统处理完一个队列内请求的速度根本无法和疯狂涌入队列中的数目相比。也就是说,队列内的请求会越积累越多,最终Web系统平均响应时候还是会大幅下降,系统还是陷入异常。

    3.4 乐观锁思路

    这个时候,我们就可以讨论一下“乐观锁”的思路了。乐观锁,是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新。实现就是,这个数据所有请求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败。这样的话,我们就不需要考虑队列的问题,不过,它会增大CPU的计算开销。但是,综合来说,这是一个比较好的解决方案。

    b83aa4baab80a2f2b4508e9b94b7513f.png

    有很多软件和服务都“乐观锁”功能的支持,例如Redis中的watch就是其中之一。通过这个实现,我们保证了数据的安全。

    最后

    欢迎大家有兴趣的可以关注我的公众号【java小瓜哥的分享平台】,文章都会在里面更新,还有各种java的资料都是免费分享的。

    展开全文
  • 接口并发测试

    千次阅读 2020-11-09 17:13:03
    postman可以用来测试接口,但是postman是串行的,当一个请求完成后才会发送下一个请求,可以测试连续执行,但不能测试并发。 【补充】:postman以json方式提交post请求,首先在headers中添加属性,接着修改body—&...

    当多人同时请求一个flask接口时,并发是一件需要考虑的事。

    1. postman

    postman可以用来测试接口,但是postman是串行的,当一个请求完成后才会发送下一个请求,可以测试连续执行,但不能测试并发。
    【补充】:postman以json方式提交post请求,首先在headers中添加属性,接着修改body—>raw,设置为json
    在这里插入图片描述

    2. jMeter

    双击jmeter.bat,jemter需要java环境,即安装jdk,见【https://www.cnblogs.com/hupilan521/p/12460580.html
    配置线程组、HTTP请求后,即可进行并发测试,这里的信息头要添加第1节中【补充】内容。
    在这里插入图片描述
    查看测试日志,发现flask接口能够接收到请求,但是同时接收的多个请求堵塞在一起返回。
    在这里插入图片描述

    3. WSGI

    • 考虑到flask接口采用app.run()的开发模式运行,因此修改为WSGI启动,但是WSGI会强行将并发测试请求转为串行方式执行。
    from gevent import pywsgi
    
    server = pywsgi.WSGIServer(('0.0.0.0', 13579), app)
    server.serve_forever()
    

    4. 线程、进程、并发

    详细了解下多线程、多进程、并发的含义,并使用python进行实践测试。

    • 进程:是正在进行的程序
    • 并发:指的是多个事件同时发生,本质是任务间的切换给人的感觉是同时在进行,称之为伪并行, 例如洗衣服和做饭,同时发生了
    • 并行:指的是多个事件同时进行中,例如一个人在写代码另一个人在写书,这两件事件是同时在进行的,一个人是无法真正的并行执行任务
    from multiprocessing import Process
    from threading import Thread
    
    os.getpid()	# 获取进程号
    

    发现flask接口开启后,一个api同时接收多个请求时,各个请求的进程号一样,当同时发送5次请求时,耗时从一次请求时的0.5s增加为1.3s,且5个请求的耗时相当。
    因此,修改api接收到参数后的处理方式,采用multiprocessing.Process()调用函数,可以发现,发送同时发送20次请求时,耗时与一次请求相当。但是当发送25个请求时,耗时开始增加到0.8s。发送30个请求时,耗时增加到1s,推测是多个进程的阻塞。

    在这里插入图片描述
    在这里插入图片描述

    5. 尝试降低单次请求计算耗时

    • 采用grequests查询题目,一次请求耗时从0.5s降为0.2s
    • 采用es客户端查询,一次请求耗时从0.5s降为0.2s,与grequests查询的效率相当
    • 将查询id拼接后,采用OR语句查询,一次请求降为0.15s
    • 将数据导入mysql数据库,采用pymysql查询,一次请求降为0.06s

    【补充】:mysql 存储过程,检查执行耗时发现和采用sql执行耗时相当

    DROP PROCEDURE select_more_topic;
    delimiter ;;
    CREATE PROCEDURE select_more_topic(in param1 varchar(10000)) 
    BEGIN 
    set @id = param1; 
    set @sel = concat('select * from anpei_practise_info where _id in (', param1, ')');
    prepare stmt from @sel; 
    execute stmt;
    deallocate prepare stmt;
    END;;
    delimiter ;
    
    call select_more_topic('"3886785006424822201","3886785006252855617"');
    

    6. 处理flask、es的多次请求堵塞问题

    python的多线程、多进程感觉效率提升的用处不大,最终采取的方案是:采用分布式缓存Redis存储数据,从Redis中一次请求的耗时约为0.01,并采用ngix进行负载均衡,将请求轮询发送到3个服务器节点上。
    这个做法就是增加了数据库存储的开销,因为目前场景下这种出现多并发查询的情况是很少的,其实不怎么划算。而且Redis数据库的维护还要考虑。

    • 采用进程池分发请求
    pool = multiprocessing.Pool(4)
    for i in range(10):
        pool.apply_async(main)
    pool.close()
    pool.join()
    
    • 采用多线程处理
    class ThreadReturn(threading.Thread):
        def __init__(self, func, args, name=''):
            threading.Thread.__init__(self)
            self.name = name
            self.func = func
            self.args = args
            self.result = self.func(*self.args)
    
        def get_result(self):
            try:
                return self.result
            except Exception as e:
                print(e)
                return None
                
    for i in range(1):
        p1 = ThreadReturn(search_mysql, (i,))
        existing_list.append(p1)
    for i in existing_list:
        i.start()
    for sub in existing_list:
        sub.join()
    
    展开全文
  • –注:同一个人浏览你的网站的同一页面,只记做一次pv 3、吞吐(fetches/sec) :单位时间内处理的请求数量 (通常由QPS和并发数决定) 4、响应时间:从请求发出到收到响应花费的时间 5、独立访客(UV):一定时间...
  • 海量请求下的接口并发解决方案

    千次阅读 2022-02-20 10:43:41
    海量请求下的接口并发解决方案 思考并整理分布式业务的解决方案,有问题请帮忙指出,谢谢! 设定一个场景,假如一个商品接口在某段时间突然上升,会怎么办? 生活中的例子来说,假设冰墩墩在当天晚上上热搜之后,...
  • 主要介绍了springboot高并发下提高吞吐的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 、RateLimiter类  RateLimiter翻译过来是速率限制器,使用的是种叫令牌桶的算法,当线程拿到桶中的令牌时,才可以执行。通过设置每秒生成的令牌数来控制速率。使用例子如下: public class TestRateLimiter ...
  • 介绍如何使用JMeter 进行接口并发测试
  • c#中并发请求api接口Imagine the following scenario:想象以下情况: User A requests resource 1 via a GET endpoint 用户A通过GET端点请求资源1 User B requests resource 1 via a GET endpoint 用户B通过GET端点...
  • 并发模拟多用户同时访问所写接口,用于测试接口所需要的的并发,和接口的最多承受用户,适用于一些简单的压力测试。
  • 并发接口性能设计思路与代码编写1. 引言2. 并发测试定义3. 并发测试分类4....因为我不管是在内部技术分享,还是对个人的培训中,都发现:很多人并不清楚接口并发测试的整体流程,或者说,并没有参与过整个
  • 使用JMeter进行接口并发测试

    千次阅读 2022-04-16 13:41:28
    一般的网络接口测试,功能性测试postman较为好用,需要测试高并发的情况下,可以用Jmeter来进行测试,postman是串行,而Jmeter可以多线程并行测试。
  • 一个接口 1s 并发500次和 1s 循环500次的区别 第一个是:1s 瞬时500次的请求,目的是检测性能处理能力,对资源的需求比较高,但是好处是一般进程不会奔溃 第二个是:1s的时间之内,来回请求500次,目的是检验接口...
  • 某市疫情爆发,由于此前我司复杂汇总该市的所有核酸检测数据,我写了一个非常简单的查询接口,根据身份证号和姓名获取核酸检测结果。现在需要对该接口进行优化,提升其性能。 自测: jemtter压测接口所在服务,并发...
  • 系统吞度量要素:一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。系统吞吐几个重要参数...
  • 项目迭代是一个优化和调整的过程,发现问题解决问题,不断优化。 秒杀业务场景,并发量很大,瓶颈在数据库,怎么解决,加缓存。用户发起请求时,从浏览器开始,在浏览器上做页面静态化直接将页面缓存到用户的浏览器端...
  • 并发接口设计

    千次阅读 2021-07-09 19:33:51
    不会吧,不会吧,不会还有人在高并发场景下做成单体应用吧,假如某个接口并发量特别大,在不做限流的情况下是不是会把整个系统拖垮,其他功能也用不了,一个接口并发高导致服务器cpu或内存起飞,最终导致整个系统死...
  • 你的接口能承受高并发吗?

    千次阅读 2019-04-29 09:59:37
    本篇主要讲解的是前阵子的一个压测问题.那么就直接开门见山 可能有的朋友不并不知道forceTransactionTemplate这个是干嘛的,首先这里先普及一下,在Java中,我们一般开启事务就有三种方式 XML中根据service及...
  • 接口并行并发稳定安全策略 一个jvm时: 1、使用java中的Lock加锁 2、synchronized重量锁 注:Lock只能在一个jvm中起效,如果集群部署,在多个JVM中就会造成无锁模式 多个jvm时: 1、数据库-行级排他锁(写锁) ...
  • nginx 限制ip、并发量、连接数等配置
  • 但是并不是并发量越大越好,太大了,硬件环境就会吃不消,反而会影响到系统整体性能,甚至奔溃。所以,在使用golang提供便捷的goroutine时,既要能够实现开启并发,也要学会如果控制并发量。 开启golang并发 golang...
  • Jmeter多接口关联并发测试

    万次阅读 多人点赞 2019-11-01 09:46:40
    这是你第次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,...
  • 系统吞吐量(TPS)、用户并发量、性能测试概念和公式 详细说明

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 381,780
精华内容 152,712
关键字:

如何判断一个接口的并发量

友情链接: test.rar