nameko 和 eventlet 已经凉了

nameko 已经凉了, 最后一次 commit 停留在了 2023.11.3 。如何将您的 Eventlet 项目迁移到 Asyncio
eventlet 也是几乎停止了维护,已经无法支持 cpython3.13+ 的版本了。nameko 无法适配新版的python3.14,eventlet 停止维护导致的失效
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 的用法
python
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 的用法
python
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 消息的用法示例
python
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 消息的用法示例
python
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:appxx 是你的 py 文件的名称
注意事项
nameko 升级到 faststream 绝对不是容易的事情,因为他们的并发模型是完全不一样的
nameko 是基于 eventlet 实现的同步协程,而 faststream 是基于 python 官方提供的 asyncio 做的异步协程,最大的区别就是调用的各种第三库也要从同步库改成异步库,这个工作量是很大的,比如把 pymysql 改成 aiomysql;requests 需要改成 httpx 等等
如果你不想改库的话,那就得用 asyncio.to_thread。但这样就麻烦了,你的项目里面又有同步库又有异步库,维护起来就很费神
各种利弊,自行权衡吧