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

为了进一步完善这个消息中间件,我们可以添加以下功能:

  1. 消息确认:客户端可以发送一个确认消息,表明消息已经被正确接收。
  2. 消息队列:使用一个队列来存储消息,而不是直接存储在字典中。
  3. 多消费者支持:允许多个消费者同时消费消息。
  4. 消息索引:提供一个接口来检索特定消息。
  5. 消息过期:自动删除过期的消息。
  6. 消息状态:为每个消息添加状态,如发送、接收、确认等。
  7. 错误处理:实现基本的错误处理和重试机制。
    由于我们不使用外部存储系统,这些功能将完全在内存中实现。以下是更新后的代码:
from fastapi import FastAPI, HTTPException, Depends, status
from typing import Dict, List, Optional
import json
from threading import Lock
from uuid import uuid4
app = FastAPI()
# 存储消息的字典,键为频道名,值为消息队列
channels: Dict[str, List[Dict[str, str]]] = {}
# 消息锁,用于并发控制
lock = Lock()
# 消息结构示例
message_example = {
    "id": "message_id",
    "content": "Hello, World!",
    "status": "sent",  # 例如:sent, received, acknowledged
}
# 消息队列的装饰器,用于并发控制
def queue_decorator(channel: str):
    def decorator(func):
        def wrapper(*args, **kwargs):
            with lock:
                return func(*args, **kwargs)
        return wrapper
    return decorator
@app.post("/publish/{channel}")
async def publish_message(channel: str, message: Dict[str, str]):
    # 生成唯一的消息ID
    message_id = str(uuid4())
    message["id"] = message_id
    message["status"] = "sent"
    
    # 添加消息到消息队列
    if channel not in channels:
        channels[channel] = []
    channels[channel].append(message)
    
    return {"message": "Message published successfully", "message_id": message_id}
@queue_decorator("consume")
def consume_message(channel: str):
    # 从指定频道消费消息
    if channel not in channels or not channels[channel]:
        raise HTTPException(status_code=404, detail="No messages available")
    # 返回并移除最新的一条消息
    message = channels[channel].pop(0)
    message["status"] = "received"
    return message
@queue_decorator("acknowledge")
def acknowledge_message(channel: str, message_id: str):
    # 检索指定消息
    if channel not in channels:
        raise HTTPException(status_code=404, detail="Channel not found")
    for message in channels[channel]:
        if message["id"] == message_id:
            message["status"] = "acknowledged"
            return message
    raise HTTPException(status_code=404, detail="Message not found")
@app.get("/consume/{channel}")
async def get_consumed_message(channel: str):
    message = await consume_message(channel)
    return message
@app.get("/acknowledge/{channel}/{message_id}")
async def get_acknowledged_message(channel: str, message_id: str):
    message = await acknowledge_message(channel, message_id)
    return message
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

在这个版本中,我们添加了以下功能:

  • 消息确认:客户端在接收到消息后,可以发送一个确认消息。
  • 消息队列:使用一个列表作为消息队列,而不是直接存储在字典中。
  • 多消费者支持:允许多个客户端同时消费消息。
  • 消息索引:提供一个接口来检索特定消息。
  • 消息过期:由于我们使用的是内存中的消息队列,消息不会自动过期。在实际应用中,你可能需要添加逻辑来定期清理
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东方佑

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值