• Docker下Python Flask+Redis+MySQL+RQ队列简单配置


    本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇

    作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的

    version: '3'
    services:
    redis:
      image: "redis"
      restart: always
      environment:
        - TZ=Asia/Shanghai
    mysql:
      build: ./mysql
      environment:
        - TZ=Asia/Shanghai
        - MYSQL_DATABASE=SZheScan
        - MYSQL_ROOT_PASSWORD=root
      ports:
        - "3306:3306"
      restart: always
      command: [
         '--character-set-server=utf8mb4',
         '--collation-server=utf8mb4_unicode_ci',
       ]

    web:
      build: .
      ports:
        - "5000:5000"
      links:
        - mysql:mysql
        - redis:redis
      depends_on:
        - mysql
      restart: always
      environment:
        - TZ=Asia/Shanghai
    rq:
      build: .
      depends_on:
        - redis
        - web
      command: "rq worker"
      restart: always
      environment:
        - TZ=Asia/Shanghai

    关键点在于rq部分:

      rq:
      build: .
      depends_on:
        - redis
        - web
      command: "rq worker"
      restart: always
      environment:
        - TZ=Asia/Shanghai

    使用command命令启动RQ队列:

    command: "rq worker"

    在Flask的配置文件config.py中如下编写:

    import os
    import redis
    from rq import Queue
    
    '''
    配置文件:
        debug=true
        secret_key,session中的24位随机盐值
        MySQL数据库配置
        数据库名为SZheScan
            python3:https://blog.csdn.net/qq562029186/article/details/81325074
    '''
    DEBUG = False
    SECRET_KEY = os.urandom(24)
    
    
    
    HOSTNAME='mysql'
    # HOSTNAME='127.0.0.1'
    PORT = '3306'
    DATABASE = 'SZheScan'
    USERNAME = 'root'
    PASSWORD = 'root'
    # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8'
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT,
                                                                                   DATABASE)
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    HOST = 'redis'
    # HOST = '127.0.0.1'
    redisPool = redis.ConnectionPool(host=HOST, port=6379, db=0, decode_responses=True)
    db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)
    queue = Queue(connection=db)

    除了引入关键的库文件之外,RQ队列关键代码在:

    db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)
    queue = Queue(connection=db)

    注意,这里链接的HOST不能是本地127.0.0.1,而是redis,而redis实际上是docker-compose.yaml文件里面redis的服务名,也就是redis服务,这样才能正常通信。

    接着使用docker-compose up 启动服务,但是出现了报错为:

    Error 99 connecting to localhost:6379. Cannot assign requested address

    虽然国内部分人给出了解决方案,但是并不太具体,在stackoverflow社区上找到了其中一个解决方案:https://stackoverflow.com/questions/54965291/error-99-connecting-to-localhost6379-cannot-assign-requested-address

    事实上,这个解决方案,解决的问题是前面我们提到的,HOST主机修改为redis服务名的问题,但是当我这样修改了之后,并且重新建立了镜像,还是会出现同样的报错。

    在查阅了相关的资料之后,作者才发现,原来RQ队列默认链接的就是本地的Redis数据库,即localhost:6379,虽然我们在配置文件,即config.py里面写了:

    db = redis.Redis(host=HOST, port=6379, db=0, decode_responses=True)

    但是RQ队列并不会智能到自动链接redis Docker服务,最终还是一次又一次去尝试链接localhost:6379,这也是为什么Docker的报错里面会出现localhost:6379的原因。

    解决方法为,docker-compose.yml启动文件中,RQ队列启动command命令指定配置文件启动

    简单介绍一下咋编写配置文件及启动服务,更详细的可以去查看其他博主的RQ队列配置文件编写

    首先编写一个rqsettings.py文件:


    # 你也可以指定使用的redis数据库
    REDIS_HOST = 'redis'
    REDIS_PORT = 6379
    REDIS_DB = 0
    # REDIS_PASSWORD = 'very secret'
    
    # 监听的队列
    QUEUES = ['high', 'default', 'low']

    可以看到在这里我们指定的是redis主机,即docker-compose.yml文件中redis docker的服务名,在stackoverflow解决方案上,也是想表达改为docker redis的服务名。

    接着在config.py中,还是象征性改一下:

    import os
    import redis
    from rq import Queue
    import rqsettings
    
    '''
    配置文件:
        debug=true
        secret_key,session中的24位随机盐值
        MySQL数据库配置
        数据库名为SZheScan
            python3:https://blog.csdn.net/qq562029186/article/details/81325074
    '''
    DEBUG = False
    SECRET_KEY = os.urandom(24)
    
    
    
    HOSTNAME='mysql'
    # HOSTNAME='127.0.0.1'
    PORT = '3306'
    DATABASE = 'SZheScan'
    USERNAME = 'root'
    PASSWORD = 'root'
    # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8'
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT,
                                                                                   DATABASE)
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    HOST = 'redis'
    # HOST = '127.0.0.1'
    redisPool = redis.ConnectionPool(host=HOST, port=6379, db=0, decode_responses=True)
    db = redis.Redis(host=rqsettings.REDIS_HOST, port=rqsettings.REDIS_PORT, db=rqsettings.REDIS_DB, decode_responses=True)
    queue = Queue(connection=db)

    其实这个改不改都行,RQ指定host和端口改为了调用rqsettings文件而已。

    最关键的在于指定配置文件启动,修改docker-compose.yml文件为

    version: '3'
    services:
     redis:
       image: "redis"
       restart: always
       environment:
         - TZ=Asia/Shanghai
     mysql:
       build: ./mysql
       environment:
         - TZ=Asia/Shanghai
         - MYSQL_DATABASE=SZheScan
         - MYSQL_ROOT_PASSWORD=root
       ports:
         - "3306:3306"
       restart: always
       command: [
         '--character-set-server=utf8mb4',
         '--collation-server=utf8mb4_unicode_ci',
      ]

     web:
       build: .
       ports:
        - "5000:5000"
       links:
        - mysql:mysql
        - redis:redis
       depends_on:
        - mysql
       restart: always
       environment:
         - TZ=Asia/Shanghai
     rq:
       build: .
       depends_on:
         - redis
         - web
       command: "rq worker -c rqsettings"
       restart: always
       environment:
         - TZ=Asia/Shanghai

    关键代码为:

    command: "rq worker -c rqsettings"

    即使用

    rq worker -c rqsettings

    -c 参数指定配置文件

    需要注意的是,配置文件实际上为rqsettings.py,是存在.py后缀的,但是在-c指定的时候,是不需要加上.py后缀指定的。

    然后删除掉之前错误建立的镜像,重新更新一下本地的docker,对于这个问题,即:

    Error 99 connecting to localhost:6379. Cannot assign requested address

    应该就可以正常解决了。

    祝好

  • 相关阅读:
    juicer 语法
    mvc 理解
    php 之 trait
    阿里P8面试官:如何设计一个扛住千万级并发的架构?
    建模
    镜像推送时出现 server gave HTTP response to HTTPS client 问题的解决方法
    git在线练习网站
    ubuntu 20.04 LTS 更换阿里云源
    Proxmox VE(Proxmox Virtual Environment)制作优盘(U盘)启动盘的教程说明方法
    KubeSphere部署Nacos集群
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13286379.html
Copyright © 2020-2023  润新知