redis、rabbitmq和celery部署——量化数据中台系列(三)

 github   

1. tgw 

   https://github.com/tgw2023/tgw

2. AmazingQuant

https://github.com/zhanggao2013/AmazingQuant

redis主要是为了作为celery的backend使用;

rabbitmq主要是为了作为celery的消息中间件使用;

一、redis

1.安装

按照官网说明即可

https://redis.io/docs/getting-started/

2.环境配置

这里为了简单上手,单节点即可,实际生产可用集群哨兵模式

配置文件
cp  /etc/redis/redis.conf /home/zhanggao/redis/redis.conf

修改配置文件
日志路径
logfile "/home/zhanggao/redis/redis-serve.log"
data路径
dir /home/zhanggao/redis


启动服务
redis-server /home/zhanggao/redis/redis.conf


启动客户端
redis-cli -h 127.0.0.1 -p 6378

关闭
redis-cli -p 6378 shutdown

3.Python测试代码

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6378, db=2,decode_responses=True)
r.set('name1:jghj', 'runoob1asd')  # 设置 name 对应的值
print(r['name1:jghj'])
print(r.get('name1:jghj'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型

一、redis

1.安装

官网下载并安装Eralng和rabbitmq,注意版本一致。

2.常用命令

#管理命令
#注意命令前面需要加一个rabbitmqctl 空格
#添加用户:
rabbitmqctl.bat add_user <username> <password>

#用户授权
rabbitmqctl.bat set_user_tags <username> administrator
# 删除一个用户
rabbitmqctl.bat delete_user <username>

# 改变用户密码 (也是改变web管理登陆密码)
rabbitmqctl.bat change_password <username> <newpassword>

#服务启动与停止

#安装,启动,停止
rabbitmg-service.bat install 或 rabbitmg-service instal
rabbitmg-service.bat stop 或rabbitmg-service stoprabbitmg-service.bat start 或 rabbitmg-server start

#启用
rabbitmg-server enable

#禁用
rabbitmg-server disable

3.Python测试代码

(1)发送消息

import redis   # 导入redis 模块

r = redis.Redis(host='localhost', port=6378, db=2,decode_responses=True)
r.set('name1:jghj', 'runoob1asd')  # 设置 name 对应的值
print(r['name1:jghj'])
print(r.get('name1:jghj'))  # 取出键 name 对应的值
print(type(r.get('name')))  # 查看类型
02
rabbitmq
1.安装
官网下载并安装Eralng和rabbitmq,注意版本一致。
2.常用命令
#管理命令
#注意命令前面需要加一个rabbitmqctl 空格
#添加用户:
rabbitmqctl.bat add_user <username> <password>

#用户授权
rabbitmqctl.bat set_user_tags <username> administrator
# 删除一个用户
rabbitmqctl.bat delete_user <username>

# 改变用户密码 (也是改变web管理登陆密码)
rabbitmqctl.bat change_password <username> <newpassword>

#服务启动与停止

#安装,启动,停止
rabbitmg-service.bat install 或 rabbitmg-service instal
rabbitmg-service.bat stop 或rabbitmg-service stoprabbitmg-service.bat start 或 rabbitmg-server start

#启用
rabbitmg-server enable

#禁用
rabbitmg-server disable

(2)接受消息

import time

import pika

hostname = 'localhost'
parameters = pika.ConnectionParameters(hostname)
connection = pika.BlockingConnection(parameters)

# 创建通道
channel = connection.channel()
# channel.queue_declare(queue='hello-1')
channel.exchange_declare(exchange='direct1-logs',
                         exchange_type='direct')

result = channel.queue_declare(exclusive=True, queue='')
queue_name = result.method.queue
print(queue_name)
channel.queue_bind(exchange='direct-logs',
                   queue=queue_name,
                   routing_key='hello-1')


def callback(ch, method, properties, body):
    print(" [x] Received %r" % (body,))
    print(" [x] %r:%r" % (method.routing_key, body))
    print(" [x] Done")
    ch.basic_ack(delivery_tag=method.delivery_tag)


# 告诉rabbitmq使用callback来接收信息
channel.basic_consume(queue_name, callback, consumer_tag="hello-consumer")
# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理,按ctrl+c退出
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

4.管理界面

celery

1.安装

pip install celery

pip install kombu

2.目录结构

3.init文件


from celery import Celery

app = Celery('celery_test', include=['celery_test.celery_app_task'])
app.config_from_object('celery_test.celeryconfig')

# celery worker -A celery_test -l info -n 1  -P eventlet
# celeryconfig 单节点redis
# celery flower --broker=redis://10.237.102.212:6379/13
# celeryconfig redis 集群
# celery flower -A celery_test -port=5555

4.add_task

import time

from celery_test.celery_app_task import add
from celery import group

data = [1, 2, 3]*10
r1 = group([add.s(i, i + 2) for i in data]).apply_async()

for async1 in r1:
    while True:
        if async1.successful():
            result = async1.get()
            print(result)
            print('执行完成', time.time())
            # async1.forget() # 将结果删除
            break
        elif async1.failed():
            print('执行失败')
        elif async1.status == 'PENDING':
            print('任务等待中被执行')
        elif async1.status == 'RETRY':
            print('任务异常后正在重试')
        elif async1.status == 'STARTED':
            print('任务已经开始被执行')

5.celery_app_task

import time

import numpy as np
from celery_test import app

a = np.ones(1000000000)


@app.task(name='celery_test.celery_app_task.taskA')
def add(x, y):
    time.sleep(4)
    return x + y

6.celeryconfig

from kombu import Exchange, Queue

BROKER_URL = 'amqp://guest:123456@127.0.0.1:15672/'  # 使用amqp作为消息代理
# BROKER_URL = 'redis://127.0.0.1:6378/2'  # 使用redis作为消息代理

RESULT_BROKER_TRANSPORT_OPTIONS = {"master_name": "mymaster"}

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'  # 把任务结果存在了Redis

# redis集群哨兵模式---------------
# CELERY_RESULT_BACKEND = 'sentinel://10.237.102.210:26379/4;' \
#                         'sentinel://10.237.102.211:26379/4;' \
#                         'sentinel://10.237.102.212:26379/4'
# BROKER_URL = 'sentinel://10.237.102.210:26379/3;' \
#              'sentinel://10.237.102.211:26379/3;' \
#              'sentinel://10.237.102.212:26379/3'
#
# BROKER_TRANSPORT_OPTIONS = {
#     'master_name': 'mymaster',
#     'service_name': 'mymaster',
#     'socket_timeout': 6000,
#     'visibility_timeout': 3600,
# }
# CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = BROKER_TRANSPORT_OPTIONS
#  redis集群哨兵模式---------------


IMPORTS = ("celery_test.celery_app_task",)
task_name_list = ['task_A', 'task_B', 'task_C', 'task_D']

CELERY_QUEUES = (
    Queue("for_task_A", Exchange("for_task_A"), routing_key="for_task_A"),
    Queue("for_task_B", Exchange("for_task_B"), routing_key="for_task_B"),
    Queue("for_task_C", Exchange("for_task_C"), routing_key="for_task_C"),
    Queue("for_task_D", Exchange("for_task_D"), routing_key="for_task_D")
)

CELERY_ROUTES = (
    {
        "celery_test.celery_app_task.taskA":
            {
                'queue': "for_task_A",
                "routing_key": "for_task_A"
            },
    },

    {
        "celery_test.celery_app_task.taskB":
            {
                'queue': "for_task_B",
                "routing_key": "for_task_B"
            },
    },

    {
        "celery_test.celery_app_task.taskC":
            {
                'queue': "for_task_C",
                "routing_key": "for_task_C"
            },
    },
    {
        "celery_test.celery_app_task.taskD":
            {
                'queue': "for_task_D",
                "routing_key": "for_task_D"
            },
    },
)

CELERY_TASK_SERIALIZER = 'msgpack'  # 任务序列化和反序列化使用msgpack方案
# CELERY_TASK_SERIALIZER = 'json'  # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = 'json'  # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60*24  # 任务过期时间(秒)

CELERY_ACCEPT_CONTENT = ['json', 'msgpack']  # 指定接受的内容类型

CELERY_REJECT_ON_WORKER_LOST = True  # 当worker进程意外退出时,task会被放回到队列中
CELERY_ACKS_LATE = True  # 只有当worker完成了这个task时,任务才被标记为ack状态

# 并发数
CELERYD_CONCURRENCY = 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你介绍一下关于 RedisRabbitMQ 的基本概念和用法,帮助你进行练习。 Redis 是一种开源的内存数据结构存储系统,它支持多种数据类型,包括字符串、哈希、列表、集合和有序集合等。Redis 可以用于缓存、消息队列、发布/订阅等多种场景,具有高性能、可扩展性和稳定性等优点。 RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol)协议的消息队列系统,它支持消息的发布/订阅、点对点通信等多种模式。RabbitMQ 可以用于任务分发、异步处理、日志处理等多种场景,具有高可用性、高可靠性和可扩展性等优点。 在实际应用中,RedisRabbitMQ 经常被用来结合使用,以实现更高效和可靠的数据处理和消息传递。 下面是一些关于 RedisRabbitMQ 的练习题: 1. 使用 Redis 实现一个简单的计数器,每次请求都能够自增1,并返回当前计数器的值。 2. 使用 RabbitMQ 实现一个简单的消息队列,其中生产者每隔一段时间会向队列中发送一个消息,消费者会不断地从队列中取出消息并进行处理。 3. 使用 RedisRabbitMQ 结合使用,实现一个简单的任务分发系统,其中生产者将任务数据存储到 Redis 中,消费者从 Redis 中取出任务数据并进行处理,处理完成后将结果发送到 RabbitMQ 中,最后由一个结果处理器进行统一的结果汇总和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值