多副本web服务

  • 单个flask服务封装的模型推理,在单机上支持的并发连接请求数量无法满足要求,压测为300左右的数量级别,压测代码如下:
  • 通过客户端传输base64字节流到服务端处理,返回抠图结果
import base64
import cv2,os
import numpy as np
import requests
import json
import threading
import timeimg_path = 'E:/mission/img'
out_path = 'E:/mission/out/'class postrequests():def __init__(self,img_path):self.url = 'http://127.0.0.1:9110/api/matting_base64'self.img_path = img_pathself.bg_color = [33, 150, 242]self.headers = {'content-type': 'application/json'}def post(self):try:with open(self.img_path, 'rb') as f:img_base64 = base64.b64encode(f.read())request_data = json.dumps({'image': img_base64.decode('utf-8'),'bg': json.dumps(self.bg_color)})headers = {"Content-Type": "application/json;charset=utf8"}start_time = time.time()r = requests.post(self.url, data=request_data, headers=headers)response_data = r.json()end_time = time.time()print(f'time:{end_time - start_time:.2f}s')result_base64 = base64.b64decode(response_data['result'])result_numpy = cv2.imdecode(np.fromstring(result_base64, np.uint8), cv2.IMREAD_COLOR)name = self.img_path.split("/")[-1]name = name.replace('.jpg', '.png')cv2.imwrite(out_path + name, result_numpy)except Exception as e:print(e)def kquan_bf(image_path):login = postrequests(image_path)return login.post()try:i = 0# 开启线程数目tasks_number =450img_names = os.listdir(img_path)print('测试启动')time1 = time.clock()while i < tasks_number:image_path = img_path+"/"+img_names[i%len(img_names)]print(image_path)t = threading.Thread(target=kquan_bf,args=(image_path,))t.start()i += 1time2 = time.clock()times = time2 - time1print(times / tasks_number)
except Exception as e:print(e)
  • 单个副本启动时,响应的请求数量维持在300左右,但超过300会有部分请求url超过重试次数,即无响应。

Nginx负载均衡多副本任务

  • 为了解决并发连接数的问题,采用nginx作为代理服务器分发http请求。
  • Nginx配置文件如下:
  • 如果端口服务出现错误可以查看nginx的errors日志文件debug,这次因为开启多端口最少连接分发中发现有不少连接到达服务器时,携带的body信息不完整,查看log发现是clientbodymaxsize设置问题。

worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;events {worker_connections  1024;
}
http {client_max_body_size     50m;client_header_timeout 1m;client_body_timeout 1m;# 文件超时proxy_connect_timeout 600;proxy_read_timeout 600;proxy_send_timeout 600;upstream  matting_base64 {least_conn;server    localhost:9111;server    localhost:9112;server    localhost:9113;server    localhost:9114;}server {listen       9110;proxy_connect_timeout 600;proxy_read_timeout 600;proxy_send_timeout 600;client_max_body_size     50m;server_name  localhost;location /api/matting_base64 {proxy_set_header Connection "";proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://matting_base64;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

本次改动一共涉及到分发策略、更改限制上传附件大小(默认为1M,如果不更改会导致高并发的情况下到达分发服务的请求,不携带有效的body),连接设置超时时间和文件上传超时时间。

最后修改nginx监听端口,依靠其自动转发即可。

nginx启动停止命令

  • 查看nginx的版本号:nginx -v

  • 启动nginx:start nginx

  • 快速停止或关闭nginx:nginx -s stop

  • 正常停止或关闭nginx:nginx -s quit

  • 配置文件nginx.conf修改重装载命令:nginx -s reload

Nginx实现负载均衡

  • 轮询
    轮询方式是Nginx负载默认的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除,如下配置后轮训10001服务和10002服务。
  • 权重weight=$
    指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。
  • ip_hash
    每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
  • 最少连接least_conn
    将请求分配到连接数最少的服务上。
  • fair
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

高并发部署策略 多副本服务+nginx均衡负载相关推荐

  1. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  2. 使用Springboot实现Nginx均衡负载功能

    ** 使用Springboot实现Nginx均衡负载功能 ** 1.什么是Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD- ...

  3. 【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)

    文章目录 1.安装docker镜像 2.查看alphin版本 3.更换alpine源 4.更换pip源 5.安装requirements.txt 6.安装完成 7.启动flask应用 8.用gunic ...

  4. Git标星46k的Java工程师知识扫盲(高并发、分布式、微服务等

    重要 众所周知,Java开发人员的生存环境可谓是与以前大相径庭,以IT行业发展来说,在十几年前的时候,IT行业的技术人才是稀缺的,程序员最初的招聘行情,只要你会敲"holle world&q ...

  5. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!...

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  6. 史上最强大型分布式架构详解:高并发+数据库+缓存+分布式+微服务+秒杀

    分布式架构设计是成长为架构师的必备技能,涵盖的内容很广,今天一次打包分享,文末有:最全分布式架构设计资料获取方式~ 负载均衡 负载均衡的原理和分类 负载均衡架构和应用场景 分布式缓存 常见分布式缓存比 ...

  7. 2018最新阿里Java技术三面(已拿Offer):JVM+高并发性能+单点登录+微服务

    一面 1.自我介绍 2.谈一个你觉得你学到最多的项目,使用了什么技术,挑战在哪里 3.Spring的bean的作用域?(比如:singleton,prototype等) 4.Spring的IOC实现原 ...

  8. wcf高并发 mysql_WCF 高并发时客户端发送和服务端接收存在等待或延迟

    前提: .net版本: .net framework 4.5.2(服务端),.net framework 3.5(客户端) 服务器:8核E5420 2.5GHZ,16G内存,1万转HDD磁盘 wind ...

  9. python 高并发http客户端_python高并发部署方案

    多进程和多线程之间的区别比较 多线程 在基于线程的多任务的环境中,所有进程至少有一个线程,但是它们可以具有多个任务.这意味着单个程序可以并发执行两个或者多个任务. 简而言之,线程就是把一个进程分为很多 ...

最新文章

  1. lvm讲解和磁盘故障案例
  2. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
  3. 自动驾驶出租车可行性研究报告:2020年能成真吗?
  4. 蜜罐技术——通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析...
  5. setfacl设置特定目录的权限
  6. Qt Remote Object(QtRO)实现进程间通信
  7. [转]使用Ant进行ssh和scp操作
  8. ORA-32004 参数设置过时的解决办法
  9. 苹果系统使用之输入法的呈现与设置问题
  10. DotNetNuke(DNN)皮肤制作--如何修改DNN中众多的CSS文件
  11. c++interesting转换为uint_巴西插头标准,旅行转换插头是怎样的?
  12. CNKI翻译助手-连接数据库失败
  13. 【MediaSoup】UDPSOCKET recv数据到rtcp包解析
  14. wincc v7.3中文版安装教程
  15. java服务器向客户端发消息_socket 服务器向指定的客户端发消息
  16. 基于MATLAB的QAM调制与解调系统设计
  17. 智能优化算法:人工水母搜索算法 -附代码
  18. 【MySQL】数据库的函数使用
  19. git rebase 理解
  20. 哪个相机可以拍gif动图_魅族手机如何拍摄Gif图片 魅族手机拍摄Gif动图的方法图解...

热门文章

  1. Fedora 34 Workstation安装后的配置
  2. HDFS——JN扩容的正确姿势
  3. Centos内核升级-Yum方式_1
  4. Linux:Centos7升级内核
  5. 关于证书(certificate)和公钥基础设施(PKI)的一切
  6. 很齐全的测试用例设计方法
  7. 71java并发编程不得不知道的几件事
  8. linux u盘插入事件,Linux 下监控USB设备拔插事件
  9. midi键盘接电脑实现电子琴功能
  10. 二分查找、分治算法——汉诺塔问题