时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路

0 阅读2分钟

nameko 和 eventlet 已经凉了

图片.png

nameko 已经凉了, 最后一次 commit 停留在了 2023.11.3 。如何将您的 Eventlet 项目迁移到 Asyncio

eventlet 也是几乎停止了维护,已经无法支持 cpython3.13+ 的版本了。nameko 无法适配新版的python3.14,eventlet 停止维护导致的失效

github.com/eventlet/ev…


nameko 的现代化替代品:faststream

我觉得最合理的处理方案,是用 faststream 替代 nameko:github.com/ag2ai/fasts…


代码实现,使用 faststream 等价实现 nameko 的功能

回答两个关键字的问题:

from nameko.events import event_handler 的替代品是什么?

from nameko.standalone.events import event_dispatcher 的替代品是什么?

event_dispatcher 的替代品,用 broker.publish

nameko 的生产者投递数据给 rabbitmq 的用法

from nameko.standalone.events import event_dispatcher

# 1. 配置 RabbitMQ 连接信息
config = {
    'AMQP_URI': 'pyamqp://ponponon:ponponon@192.168.38.223:5672/'
}

# 2. 创建事件分发器 (Dispatcher)
dispatch = event_dispatcher(config)

# 3. 发布事件 (同步操作)
# service_name 对应 exchange_name (source_service)
# event_type 对应 routing_key (event_type)
dispatch(
    "source_service", 
    "event_type", 
    {"data": "hello"}
)

print("事件已发布 (Nameko)")

faststream 的生产者投递数据给 rabbitmq 的用法

import asyncio
from faststream.rabbit import RabbitBroker

async def main():
    broker = RabbitBroker("amqp://ponponon:ponponon@192.168.38.223:5672/")
    
    async with broker:
        # 替代 event_dispatcher
        # exchange 对应服务名,routing_key 对应事件名
        await broker.publish(
            {"data": "hello"}, 
            exchange="source_service", 
            routing_key="event_type"
        )
        print("事件已发布")

asyncio.run(main())

event_handler 的替代品,使用 @broker.subscriber

nameko 作为消费者消费 rabbitmq 消息的用法示例

from nameko.events import event_handler

class ReceiverService:
    # 1. 服务名称 (对应 FastStream 的 RabbitExchange 名称)
    name = "receiver_service"

    # 2. 替代 FastStream 的 @broker.subscriber
    # source_service 对应 exchange="source_service"
    # event_type 对应 routing_key="event_type"
    @event_handler("source_service", "event_type")
    def handle_event(self, payload):
        # Nameko 默认在内部自动创建队列并处理消息
        print(f"收到事件消息 (Nameko): {payload}")

# 启动方式: nameko run nameko_consumer

faststream 作为消费者消费 rabbitmq 消息的用法示例

from faststream import FastStream
from faststream.rabbit import RabbitBroker, RabbitExchange, ExchangeType

broker = RabbitBroker("amqp://ponponon:ponponon@192.168.38.223:5672/")
app = FastStream(broker)

# 定义 Exchange (对应 nameko 的 source_service)
event_exchange = RabbitExchange("source_service", type=ExchangeType.TOPIC)

# 替代 event_handler
# routing_key 对应 nameko 的 event_type
@broker.subscriber(queue="my_handler_queue", exchange=event_exchange, routing_key="event_type")
async def handle_event(msg: dict):
    print(f"收到事件消息: {msg}")

启动方式: faststream run xx:app xx 是你的 py 文件的名称

注意事项

nameko 升级到 faststream 绝对不是容易的事情,因为他们的并发模型是完全不一样的

nameko 是基于 eventlet 实现的同步协程,而 faststream 是基于 python 官方提供的 asyncio 做的异步协程,最大的区别就是调用的各种第三库也要从同步库改成异步库,这个工作量是很大的,比如把 pymysql 改成 aiomysql;requests 需要改成 httpx 等等

如果你不想改库的话,那就得用 asyncio.to_thread。但这样就麻烦了,你的项目里面又有同步库又有异步库,维护起来就很费神

各种利弊,自行权衡吧