如何提高项目并发量

 

# 前端
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

  1. 直接双击.exe文件执行即可。

  2. 安装完成后,配置环境变量  RABBITMQ_SERVER

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

安装RabbitMQ-Plugins

RabbitMQ-Plugins相当于是一个管理界面,方便我们在浏览器界面查看RabbitMQ各个消息队列以及exchange的工作情况。

  1. 打开命令行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\systemprofileC:\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()

 

posted on 2023-08-23 22:22  情生意动  阅读(11)  评论(0)    收藏  举报