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

embedded/2024/10/22 18:34:28/

在分布式系统中,经常需要不同的服务或组件之间进行通信和协作。传统的同步请求-响应模式虽然简单直观,但可能会导致阻塞和性能问题。为了解决这个问题,我们开发了一个基于 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/embedded/23058.html

相关文章

Linux系统——Nginx常见面试题

目录 一、Nginx使用场景 二、Nginx的发展历史 三、Nginx没出现之前都存在过什么问题 四、Nginx的优点 五、正向代理和反向代理分别是什么 六、Nginx限流问题 七、Nginx动静分离 八、什么是负载均衡 九、Nginx负载均衡的策略有哪些 十、Nginx多进程模型 十一、为什么…

git commit 不进入 Vim 编辑模式,提示 ihint: Waiting for your editor to close the file...

git commit 不进入 Vim 模式问题 输入 git commit 后 提示 ihint: Waiting for your editor to close the file... 然后自动退出提交。 一般是 git 默认编辑器使用了其他的 如 cat // 用此命令查看当前默认编辑器 git config --get core.editor cat解决方法&#xff1a…

燃气管道3D可视化:智慧燃气新篇章的引领者

随着科技的不断进步,智慧城市建设已成为我国城市发展的重要方向。燃气作为城市生活中不可或缺的重要能源,其安全、高效、便捷的管理显得尤为关键。3D可视化技术,不仅极大地提升了燃气管道管理的智能化水平,更为我们打开了一个全新…

OC 常用第三方框架使用记录一

#HBDNavigationBar self.hbd_titleTextAttributes [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 19)~] self.hbd_barStyle .black self.hbd_barShadowHidden true#TYSnapshotScroll 截图拼图大师…

反汇编:OllyDBG/objdump分析

一、OllyDBG 1、 2、可以通过file->open的方法打开需要查看的程序 或者是 dll文件 3、反汇编窗口中:各列的含义; 反汇编中的第一列:是指令在内存中存放的地址; 反汇编中的第二列:是所谓的汇编语言中的操作码&…

有趣的 CSS 图标整合技术!sprites精灵图,css贴图定位

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合…

vue 根据url预览或下载文件

预览是通过浏览器属性去实现的,谷歌内核的都支持 file数据格式 {"fileId": "78b60bdfd5ed4b40b61cd75ba7d85e57","fileName": "icon_001.png","filePath": "http://localhost:8182/2024/20240329/78b60bd…

2024新版计算机网络视频教程65集完整版(视频+配套资料)

今日学计算机网络,众生皆叹难理解。 却见老师神乎其技,网络通畅如云烟。 协议层次纷繁复杂,ARP、IP、TCP、UDP。 路由器交换机相连,数据包穿梭无限。 网络安全重于泰山,防火墙、加密都来添。 恶意攻击时刻存在&#xf…