完全用python 实现消息中间件8

为了完善这个AI服务和User服务的消息中间件示例,我们需要添加一些关键的功能和优化:

  1. 任务队列:使用一个队列来存储任务,而不是直接存储在字典中。
  2. 任务确认:客户端可以发送一个确认消息,表明任务已经被正确接收。
  3. 消息索引:提供一个接口来检索特定任务。
  4. 任务过期:自动删除过期的任务。
  5. 错误处理:实现基本的错误处理和重试机制。
    以下是更新后的代码:

User服务端(发送任务)

from fastapi import FastAPI, HTTPException
from typing import Dict
import requests
import time
app = FastAPI()
# 发送任务到AI服务
def send_task_to_ai(task: Dict):
    response = requests.post("http://ai-service-url/receive_task", json=task)
    if response.status_code != 200:
        raise HTTPException(status_code=500, detail="Failed to send task to AI service")
    return response.json()
@app.post("/submit_task")
async def submit_task(task: Dict):
    try:
        response = send_task_to_ai(task)
        return {"status": "Task submitted", "task_id": response["task_id"]}
    except HTTPException as e:
        return {"status": "Error", "message": str(e)}
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8001)

AI服务端(接收任务并处理)

from fastapi import FastAPI, HTTPException
from typing import Dict
import json
import time
import threading
app = FastAPI()
# 存储任务的字典,键为任务ID,值为任务内容
tasks: Dict[str, Dict[str, str]] = {}
# 任务队列的装饰器,用于并发控制
def queue_decorator(func):
    def wrapper(*args, **kwargs):
        with lock:
            return func(*args, **kwargs)
    return wrapper
# 清理过期的任务的定时任务
def clean_expired_tasks():
    while True:
        time.sleep(60)  # 每分钟检查一次
        for task_id, task in tasks.items():
            if task["expiration_time"] and time.time() > task["expiration_time"]:
                del tasks[task_id]
# 启动定时任务
import threading
threading.Thread(target=clean_expired_tasks).start()
@app.post("/receive_task")
async def receive_task(task: Dict):
    task_id = str(uuid4())
    task["id"] = task_id
    tasks[task_id] = task
    
    # 等待任务个数或时间t满足条件
    while len(tasks) < 5 or time.time() < tasks[task_id]["expiration_time"]:
        time.sleep(1)
    
    # 开始处理任务
    result = {"id": task_id, "content": "AI processed task"}
    
    # 移除处理完成的任务
    del tasks[task_id]
    
    return {"status": "Task processed", "result": result}
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8002)

在这个更新后的示例中,我们添加了以下功能:

  • 任务队列:使用一个字典作为任务队列,其中键是任务ID,值是任务内容。
  • 任务确认:AI服务端在接收任务后,会返回一个任务ID,User服务端可以使用这个ID来确认任务。
  • 消息索引:提供一个接口来检索特定任务的状态。
  • 任务过期:任务在提交时会设置一个过期时间,AI服务端会定期清理过期的任务。
  • 错误处理:在发送任务到AI服务端时,如果失败,User服务端会返回一个错误消息。
    请注意,这个示例仍然是一个非常简化的AI服务和User服务的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方佑

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值