通过Redis实现一个异步请求-响应程序

news/2024/10/22 18:32:03/

在分布式系统中,经常需要不同的服务或组件之间进行通信和协作。传统的同步请求-响应模式虽然简单直观,但可能会导致阻塞和性能问题。为了解决这个问题,我们开发了一个基于 Redis 的异步请求-响应程序,实现了请求和响应的解耦,提高了系统的并发性和响应能力。

程序概述

该程序包含以下主要函数:

  1. SyncRequest(ctx context.Context, id, funcKey string, params interface{}, timeout int) (interface{}, error)
    • 用于发起请求,将请求信息存储在 Redis 中,并异步等待响应。
  2. GetCallInfoById(ctx context.Context, id string) (string, interface{}, error)
    • 根据请求 ID 从 Redis 中获取请求信息,供其他程序处理。
  3. PublishReplyData(ctx context.Context, id string, data interface{}) error
    • 将响应数据发布到 Redis 频道,供请求方接收。

通过这些函数,不同的程序可以实现异步的请求-响应模式,避免阻塞和提高并发性。

使用示例

假设我们有两个程序 A 和 B,需要进行异步通信。程序 A 发起请求,程序 B 处理请求并返回响应。

程序 A

package mainimport ("context""fmt""sagooiot/pkg/baseLogic"
)func main() {ctx := context.Background()id := "request_123" // 请求 IDfuncKey := "SomeFunction" // 函数键params := map[string]string{"key1": "value1", "key2": "value2"} // 请求参数// 发起异步请求response, err := baseLogic.SyncRequest(ctx, id, funcKey, params, 60)if err != nil {fmt.Println("Error:", err)return}// 处理响应fmt.Println("Response:", response)
}

在这个示例中,程序 A 调用 baseLogic.SyncRequest 发起一个异步请求,将请求信息存储在 Redis 中,并等待响应。超时时间设置为 60 秒。响应数据将被打印出来。

程序 B

package mainimport ("context""fmt""sagooiot/pkg/baseLogic"
)func main() {ctx := context.Background()id := "request_123" // 请求 ID// 从 Redis 获取请求信息funcKey, params, err := baseLogic.GetCallInfoById(ctx, id)if err != nil {fmt.Println("Error:", err)return}// 处理请求response := processRequest(funcKey, params)// 发布响应err = baseLogic.PublishReplyData(ctx, id, response)if err != nil {fmt.Println("Error:", err)return}
}func processRequest(funcKey string, params interface{}) interface{} {// 模拟处理请求的逻辑fmt.Println("Processing request:", funcKey, params)return "This is the response"
}

在这个示例中,程序 B 调用 baseLogic.GetCallInfoById 从 Redis 中获取请求信息。然后,它调用 processRequest 函数处理请求,并调用 baseLogic.PublishReplyData 将响应发布到 Redis 频道。

通过这种方式,程序 A 和程序 B 实现了异步的请求-响应模式。程序 A 发起请求后可以继续执行其他操作,而不会阻塞等待响应。程序 B 在收到请求信息后,可以在合适的时机处理并发布响应。两个程序之间通过 Redis 作为中介进行通信,实现了解耦和异步执行。

总结

该异步请求-响应程序提供了一种高效的方式,允许不同的服务或组件之间进行异步通信。通过利用 Redis 作为中介,请求和响应可以被解耦,提高了系统的并发性和响应能力。使用该程序可以避免阻塞,提高分布式系统的整体性能和可伸缩性。

以上程序,我们在企业级开源物联网系统SagooIoT产品中使用。


http://www.ppmy.cn/news/1434056.html

相关文章

未来已来:解锁AGI的无限潜能与挑战

未来已来:解锁AGI的无限潜能与挑战 引言 假设你有一天醒来,发现你的智能手机不仅提醒你今天的日程,还把你昨晚做的那个奇怪的梦解释了一番,并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节,而是人工通用智能…

【抖音电商入驻-开小店教程】

抖店入住教程 抖音电商介绍如何入驻关注我们,不迷路 抖音电商介绍 抖店是抖音电商商家一站式平台,包括网页端、APP端、客户端三种形态,在这里商家可以完成从入驻、开通抖音店铺、发布商品、订单履约、售后服务等一系列动作,同时也…

【性能测试】接口测试各知识第4篇:Jmeter 八大元件及执行顺序,学习目标【附代码文档】

接口测试完整教程(附代码资料)主要内容讲述:接口测试,学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标,RESTFUL1. 理解接口的概念,2.什么是接口测试…

BERT 微调中文 NER 模型

查看GPU数量和型号 import torch# 检查CUDA是否可用 if torch.cuda.is_available():print("CUDA is available!")# 还可以获取CUDA设备的数量device_count torch.cuda.device_count()print(f"Number of CUDA devices: {device_count}")# 获取第一块GPU的…

【Day 4】Maven + Spring入门 + HTTP 协议

开始学后端! 1 Maven Maven 是一款用于管理和构建 Java 项目的工具,基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。 作用: 依赖管理 方便快捷的管理项目依赖的资源(jar 包),避免版本冲突问题 …

攻防世界fileclude题解

攻防世界fileclude题解 ​​ 题目要求file1和file2参数不能为空 且file2这个文件内容值为hello ctf,用php://input 然后POST体内输入hello ctf即可满足这个if条件 满足这个条件后就会包含file1变量所指定的那个文件。用php伪协议来跨目录包含一下flag.php文件就可以…

软考140-上午题-【软件工程】-软件工具

一、软件工具 用来辅助软件开发、运行、维护、管理和支持等过程中的活动的软件称为软件工具。 1-1、软件开发工具 对应于软件开发过程的各种活动,软件开发工具通常有:需求分析工具、设计工具、编码与 排错工具、测试工具等。 1-2、软件维护工具 辅助软…

idm序列号永久激活码2023免费可用 IDM软件破解版下载 最新版Internet Download Manager 网络下载加速必备神器 IDM设置中文

IDM是一款多线程下载工具,全称Internet Download Manager。IDM的多线程加速功能,能够充分利用宽带,所以下载速度会比较快,而且它支持断点续传。它的网站音视频捕获、站点抓取、静默下载等功能,也特别实用。 idm使用技…