如何提高项目并发量

# 前端 1.用cdn,静态资源,放到cdn上,使用第三方存储(js,css,静态图片) 2.用精灵图(一个大图,上面有很多小图,用定位,定位到小图),一次请求拿回来的图,以后好多位置可以用 3.前端缓存(响应头设置缓存时间)cache-control # 高性能web服务器部署项目:nginx 1、nginx的请求转发,nginx性能高,负载均 2、nginx做集群(dns解析负载(随机一个IP地址),负载均衡硬件 f5) 3、动静分离(静态资源直接通过nginx转发,拿去;uwsgi只负责处理动态请求) 4、集群化部署 5、拆服务(分布式,微服务) #kong基于nginx做二次开发 # 项目部署(使用性能高的服务器部署项目:gevent+uwsgi) https://zhuanlan.zhihu.com/p/358163330替代性能低的wsgiref部署项目-使用uwsgi(c写的wsgi服务器)部署 使用gunicorn(python写的wsgi服务器)部署 # 代码层面 1.做缓存(redis) 2.页面静态化(不适用于app和小程序),提前生成一个首页页面(被访问频繁的页面),数据不一致(当有数据增加,再重新生成一次这个页面),用异步:用celery,django的信号(异步操作),当对象保存时,重新生成静态页面
# 对于首页访问量很高,就直接让用户不要经过缓存或者数据库去拿了,直接生成一个静态页面,访问我的时候直接把这个静态页面返回,但是里面的数据过一会就变,我可以设置一下每隔10秒钟在生成静态页面 # 异步操作(celery),一个请求需要耗时3s,设计成异步--请求来了--》直接返回(任务已提交,请求正在处理) 小米秒杀:您正在排队(前端设置了定时,每隔5s,发送一个请求,查是否秒杀成功) 保存视频,发送邮件,保存文章 后台管理,统计最近三,六个月的订单量--》折线图,饼状图展示 # 数据库优化,优化sql,外键尽量不建立,适当建索引,读写分离,数据库集群,分库分表 # 优化代码,尽量不在for循环里查数据库---》算法 # 换语言 # 代码优化不了的,加机器,C10K # IO同步id,异步id,io多路复用
消息队列介绍
# 消息队列是什么 # 消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下,生活中买东西,需要排队,先排的人先买消费,就是典型的“先进先出” # message queue:消息队列 简称mq # 消息队列解决什么问题? 1.应用解耦:单体应用---》分布式应用 -把一个大功能拆分成小功能,功能直接数据使用mq交互 # 流量削峰 -celery异步 -秒杀场景:比如某一时刻并发秒杀--不是同步处理--》而是把秒杀任务放到消息队列中,一点点消费 # 消息分发 -发布订阅:订阅者订阅了消息,只要发布者发布,订阅者就能收到 # 异步消息 -如果使用resful调用---》同步调用 -发送了调用请求后,继续干自己的活,等另一个服务数据准备好,会放到mq中,再去mq中取 # 常见消息队列比较 rabbitmq和kafka 1.编程语言不通erlang,java 2.对客户端支持都一样(python\java\go) 3.处理数据能力:rabbitmq低于kafak 4.可靠性:rabbitmq更高

rabbitmq安装
windows安装步骤
首先要说明的是,rabbitMQ由erlang语言开发,erlang也被中国人称为二郎神
访问的是国外github的网址,所以需要等很长很长的时间,请耐心等待哦~
因此,安装RabbitMQ之前,应先安装erlang,需要注意的是,不同的rabbitMQ版本对应的erlang版本不同,我们可以在官网中进行查看:https://www.rabbitmq.com/install-windows.html

点击支持的二郎神版本,二郎需要去Erlang下载,地址:https://www.erlang.org/patches/otp-25.0

我选择的是:otp_win64_25.0.exe 搭配 rabbitmq-server-3.12.2.exe

下载完成后
安装二郎神
进入安装步骤,先安装二郎神,选择默认安装,安装完成后,配置环境变量
新建系统变量-键入变量名ERLANG_HOME,键入变量值:erlang安装路径,我的路径为:C:\Program Files\Erlang , 如下图:

然后添加系统path路径(系统环境变量中)中,添加 : %ERLANG_HOME%\bin

注意:这里要使用管理员身份运行cmd

安装RabbitMQ
下载地址:https://www.rabbitmq.com/install-windows.html
-
直接双击.exe文件执行即可。
- 安装完成后,配置环境变量 RABBITMQ_SERVER

然后添加系统path路径中,添加 : %RABBITMQ_SERVER%\sbin

安装RabbitMQ-Plugins
RabbitMQ-Plugins相当于是一个管理界面,方便我们在浏览器界面查看RabbitMQ各个消息队列以及exchange的工作情况。
-
打开命令行cd进入rabbitmq的sbin目录(或者进入sbin文件下,直接敲cmd,回车)
>:cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.6\sbin
然后执行安装
>:rabbitmq-plugins enable rabbitmq_management

安装完成后,
验证
上面的命令执行成功之后,我们就可以通过http://localhost:15672来访问web端的管理界面
输入用户名:guest,密码:guest(默认)就可以进入管理界面

分享几条命令:
>:net start RabbitMQ #启动 >:net stop RabbitMQ #停止 >:rabbitmqctl status #查看状态 健康检查: rabbitmqctl status 启动监控管理器:rabbitmq-plugins enable rabbitmq_management 关闭监控:rabbitmq-plugins disable rabbitmq_management 停止服务:rabbitmq-service stop 启动服务:rabbitmq-service start 重启命令:net stop RabbitMQ && net start 帮助命令:rabbitmqctl help >:rabbitmqctl list_queues #查看所有队列 >:rabbitmqctl reset #清除所有队列 >:rabbitmqctl list_exchanges #查看所有交换器 >:rabbitmqctl add_user username password #添加用户 >:rabbitmqctl set_user_tags username administrator #分配角色 >:rabbitmqctl list_bindings #查看交换器和队列的绑定关系
Windows rabbitMQ无法访问http://localhost:15672问题
1.问题
成功安装RabbitMQ后,RabbitMQ管理模块的插件也启动了但是还是无法访问http://localhost:15672。
- 其实在打开节点的时候就提示了问题:

- 在sbin/路径下敲rabbitmqctl status查看原因

2.问题解决
这里直接告诉大家问题出在哪吧,是Erlang新版本的cookie位置换了!
两种解决办法:
- 使用旧版本Erlang
- cookie替换到正确的位置
打开路径C:\Windows\System32\config\systemprofile

我们看到了这里有一个.erlang.cookie,复制这个文件到C:\Users\你的用户名下
如果没有这个文件,请打开菜单栏的Erlang快捷方式,出现白色窗口的时候,
C:\Windows\System32\config\systemprofile这个目录下就会出现这个文件,可能会慢一些耐心等
要确保C:\Windows\System32\config\systemprofile和C:\Users\你的用户名下的cookie是同一个文件!(里面的随机串不一样,所以需要copy)
替换完成后,再次使用rabbitmqctl status查看,发现问题不在了,说明问题解决了:

- 重新运行,如下操作
1、进入安装目录 cd D:\RabbitMQ Server\rabbitmq_server-3.11.7\sbin 2、打开节点:rabbitmqctl start_app 3、配置管理模块:rabbitmq-plugins enable rabbitmq_management 4、关闭节点:rabbitmqctl stop
- rabbitmat访问http://localhost:15672成功

docker部署rabbitMQ
# centos 安装 1.安装配置epel源 2.安装erlang >:yum -y install erlang # 安装RabbitMQ >:yum -y install rabbitmq-server # docker运行 >:docker pull rabbitmq:management # 设置用户名和密码,做端口映射:一个端口是web界面的端口,另一个端口是服务端口 >:docker run -di --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management # web 管理页面的端口是 15672 服务端口是5672,使用python连接时候,指定这个端口
基于queue实现生产者和消费者
import queue import threading message = queue.Queue(10) def producer(i): while True: message.put(i) print('生产者生产了:%s' % i) def consumer(i): while True: msg = message.get() print('消费者消费了:%s'%msg) for i in range(12): t = threading.Thread(target=producer, args=(i,)) t.start() for i in range(10): t = threading.Thread(target=consumer, args=(i,)) t.start()
基本使用
# 实现生成者消费者模型>:pip3 install pika #安装模块 # 官网地址:https://www.rabbitmq.com/getstarted.html 不同语言的示例代码,
# 对于RabbitMQ来说,生成和消费不再针对内存里的一个queue对象,而是某台服务器上的rabbitMQ Sever实现的消息队列
生产者
#!/usr/bin/env python import pika # 1.第一步:连接
# 无密码 # connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1',port=15672)) # channel = connection.channel() # 有密码 credentials=pika.PlainCredentials("guest","guest") connection=pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1',port=5672,credentials=credentials)) #这里有个bug,port=5672 # 2.第二步:得到一个channel channel = connection.channel() # 3.声明一个队列(创建一个队列),叫hello channel.queue_declare(queue='hello') channel.basic_publish(exchange='',routing_key='hello', body='hello zs li wwu') # body:发送到队列的内容,routing_key:消息对垒的名字 print("[生产者] Sent 'Hello World!'") connection.close()
消费者
import pika, sys, os
# 第一步:连接 credentials = pika.PlainCredentials("guest", "guest") connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672, credentials=credentials)) # 这里有个bug,port=5672
# 第二步:得到一个通道 channel = connection.channel()
# 第三部:声明一个通道的名字 channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(f" [消费者] Received {body}") channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) print(' [消费者] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
浙公网安备 33010602011771号