嘉峪关市建设局公示公告网站建设项目试运行备案申请网站

张小明 2026/3/12 10:34:47
嘉峪关市建设局公示公告网站,建设项目试运行备案申请网站,Wordpress写网页,wordpress无法新建页面前言 2024年初#xff0c;我们的订单系统经常出现超时问题。用户下单后#xff0c;系统需要同时调用库存服务、支付服务、通知服务#xff0c;任何一个服务慢都会导致整个请求超时。 我们决定引入消息队列#xff0c;将同步调用改为异步处理。这个改造带来了…前言2024年初我们的订单系统经常出现超时问题。用户下单后系统需要同时调用库存服务、支付服务、通知服务任何一个服务慢都会导致整个请求超时。我们决定引入消息队列将同步调用改为异步处理。这个改造带来了显著的性能提升。一、问题同步调用的瓶颈原始的订单流程是这样的pythonapp.route(/api/orders, methods[POST]) def create_order(): # 1. 创建订单 order Order.create(request.json) # 2. 同步调用库存服务 inventory_response requests.post( http://inventory-service/deduct, json{product_id: order.product_id, quantity: order.quantity} ) if inventory_response.status_code ! 200: return {error: 库存不足}, 400 # 3. 同步调用支付服务 payment_response requests.post( http://payment-service/pay, json{order_id: order.id, amount: order.amount} ) if payment_response.status_code ! 200: return {error: 支付失败}, 400 # 4. 同步调用通知服务 notify_response requests.post( http://notify-service/send, json{order_id: order.id, type: order_created} ) return {order_id: order.id}, 201问题任何一个服务慢都会导致整个请求慢任何一个服务故障都会导致订单创建失败耦合度太高难以扩展。性能数据库存服务200ms支付服务300ms通知服务150ms总耗时200 300 150 650ms二、解决方案引入RabbitMQ我们选择RabbitMQ作为消息队列。改造后的流程2.1 发布订单创建事件pythonimport pika import json def create_order(): # 1. 创建订单 order Order.create(request.json) # 2. 发布事件到消息队列 connection pika.BlockingConnection(pika.ConnectionParameters(rabbitmq)) channel connection.channel() # 声明交换机和队列 channel.exchange_declare(exchangeorders, exchange_typetopic) # 发布消息 message { order_id: order.id, product_id: order.product_id, quantity: order.quantity, amount: order.amount } channel.basic_publish( exchangeorders, routing_keyorder.created, bodyjson.dumps(message) ) connection.close() # 立即返回响应 return {order_id: order.id}, 201耗时仅需10ms发布到队列2.2 消费者库存服务pythondef inventory_consumer(): connection pika.BlockingConnection(pika.ConnectionParameters(rabbitmq)) channel connection.channel() channel.exchange_declare(exchangeorders, exchange_typetopic) result channel.queue_declare(queueinventory_queue, durableTrue) queue_name result.method.queue # 绑定队列到交换机 channel.queue_bind( exchangeorders, queuequeue_name, routing_keyorder.created ) def callback(ch, method, properties, body): message json.loads(body) try: # 扣减库存 deduct_inventory( message[product_id], message[quantity] ) # 确认消息 ch.basic_ack(delivery_tagmethod.delivery_tag) except Exception as e: # 拒绝消息重新入队 ch.basic_nack(delivery_tagmethod.delivery_tag, requeueTrue) channel.basic_consume( queuequeue_name, on_message_callbackcallback ) print(库存服务已启动等待消息...) channel.start_consuming() if __name__ __main__: inventory_consumer()2.3 消费者支付服务pythondef payment_consumer(): connection pika.BlockingConnection(pika.ConnectionParameters(rabbitmq)) channel connection.channel() channel.exchange_declare(exchangeorders, exchange_typetopic) result channel.queue_declare(queuepayment_queue, durableTrue) queue_name result.method.queue channel.queue_bind( exchangeorders, queuequeue_name, routing_keyorder.created ) def callback(ch, method, properties, body): message json.loads(body) try: # 处理支付 process_payment( message[order_id], message[amount] ) ch.basic_ack(delivery_tagmethod.delivery_tag) except Exception as e: ch.basic_nack(delivery_tagmethod.delivery_tag, requeueTrue) channel.basic_consume( queuequeue_name, on_message_callbackcallback ) print(支付服务已启动等待消息...) channel.start_consuming()2.4 消费者通知服务pythondef notify_consumer(): connection pika.BlockingConnection(pika.ConnectionParameters(rabbitmq)) channel connection.channel() channel.exchange_declare(exchangeorders, exchange_typetopic) result channel.queue_declare(queuenotify_queue, durableTrue) queue_name result.method.queue channel.queue_bind( exchangeorders, queuequeue_name, routing_keyorder.created ) def callback(ch, method, properties, body): message json.loads(body) try: # 发送通知 send_notification( message[order_id], order_created ) ch.basic_ack(delivery_tagmethod.delivery_tag) except Exception as e: ch.basic_nack(delivery_tagmethod.delivery_tag, requeueTrue) channel.basic_consume( queuequeue_name, on_message_callbackcallback ) print(通知服务已启动等待消息...) channel.start_consuming()三、可靠性保证3.1 消息持久化python# 声明持久化队列 channel.queue_declare( queuepayment_queue, durableTrue # 队列持久化 ) # 发布持久化消息 channel.basic_publish( exchangeorders, routing_keyorder.created, bodyjson.dumps(message), propertiespika.BasicProperties( delivery_mode2 # 消息持久化 ) )3.2 消息确认机制pythonCopy code# 手动确认消息 def callback(ch, method, properties, body): try: process_message(body) ch.basic_ack(delivery_tagmethod.delivery_tag) # 确认 except Exception as e: ch.basic_nack(delivery_tagmethod.delivery_tag, requeueTrue) # 拒绝并重新入队 # 禁用自动确认 channel.basic_consume( queuequeue_name, on_message_callbackcallback, auto_ackFalse # 手动确认 )3.3 死信队列python# 声明死信交换机 channel.exchange_declare(exchangedlx, exchange_typedirect) channel.queue_declare(queuedead_letter_queue, durableTrue) channel.queue_bind(exchangedlx, queuedead_letter_queue) # 声明普通队列指定死信交换机 channel.queue_declare( queuepayment_queue, durableTrue, arguments{ x-dead-letter-exchange: dlx, x-dead-letter-routing-key: dead_letter } )四、监控和告警pythonimport logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) def callback(ch, method, properties, body): start_time time.time() try: process_message(body) duration time.time() - start_time logger.info(f消息处理成功, 耗时: {duration}ms) ch.basic_ack(delivery_tagmethod.delivery_tag) except Exception as e: logger.error(f消息处理失败: {str(e)}) ch.basic_nack(delivery_tagmethod.delivery_tag, requeueTrue)五、国际化团队的挑战在跨国团队中消息队列的错误日志和告警需要支持多语言。我们使用同言翻译Transync AI来自动翻译消息队列的错误信息和监控告警确保不同语言背景的团队成员能够快速理解问题并做出响应。六、性能对比指标同步调用异步消息队列提升平均响应时间650ms10ms-98.5%P99响应时间2000ms50ms-97.5%系统吞吐量1000 req/s10000 req/s900%故障隔离否是-七、最佳实践幂等性设计消费者应该能够安全地处理重复消息超时设置为消息处理设置合理的超时时间监控队列深度及时发现消费者处理不过来的情况分离关注点生产者和消费者应该解耦定期审查定期检查死信队列找出问题消息。八、结语消息队列的引入从根本上改变了我们的系统架构。从同步的紧耦合到异步的松耦合系统的可扩展性和可靠性都得到了显著提升。如果你的系统也在经历性能瓶颈消息队列可能是一个很好的解决方案。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

泉州网站平台建设公司360网站推广官网网址

文章目录 面向对象 类与对象匿名对象创建对象的内存分析 栈(stack)堆(heap)方法区PC寄存器本地方法栈 内部类 成员内部类局部内部类匿名内部类静态内部类 包装类 拆箱和装箱操作字符串转换基本数据类型和包装类型的区别Integer类型的重点 抽象类 抽象方法不能被实例化常见问题抽…

张小明 2026/3/5 4:42:06 网站建设

做网站维护学什么编程语言卡姿兰网站建设策划书

第一章:Docker MCP 网关协议转换的技术背景与核心价值在现代微服务架构中,不同组件常采用异构通信协议进行交互,如 HTTP/REST、gRPC、MQTT 等。Docker MCP(Microservice Communication Protocol)网关作为服务间通信的中…

张小明 2026/3/5 4:42:07 网站建设

做网站备案照片的要求检测网站是否被做跳转

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个大厂Vue2面试题分析应用,需要:1.展示TOP20高频面试题 2.每题标注考察知识点(如虚拟DOM、组件通信等)3.提供可交互的代码沙箱…

张小明 2026/3/5 4:42:07 网站建设

帝国cms获取网站地址怎样让百度收录网站

从内存墙到效率革命:FlashAttention如何重构大模型训练范式 【免费下载链接】flash-attention Fast and memory-efficient exact attention 项目地址: https://gitcode.com/GitHub_Trending/fl/flash-attention "训练到一半显存爆了!"—…

张小明 2026/3/5 4:42:08 网站建设

东莞金融网站建设南昌电子商务网站建设

视频课件智能提取:从视频到PDF的一键转换方案 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在日常学习与工作中,我们常常需要从视频资料中提取关键的PPT内容…

张小明 2026/3/5 4:42:11 网站建设

深圳 学习网站wordpress twentyten 漏洞

你是否曾在游戏或动画中看到那些"纸片人"般的布料效果?传统渲染引擎为了性能往往牺牲了物理真实性。今天,我将带你用Taichi这个高性能Python框架,从零构建一个真正能模拟丝绸般飘逸效果的布料物理引擎!🎯 【…

张小明 2026/3/5 4:42:50 网站建设