{"id":17684356,"url":"https://github.com/dpwgc/kapokmq","last_synced_at":"2025-05-12T21:13:30.787Z","repository":{"id":43917601,"uuid":"443557200","full_name":"dpwgc/kapokmq","owner":"dpwgc","description":"基于Go整合Gossip+WebSocket的轻量级分布式消息队列。实现功能：订阅/发布推送、点对点推送、延时消息推送、消费失败自动重试、数据持久化、WAL预写日志、主从节点部署、集群负载均衡、ACK确认机制、内置网页端控制台","archived":false,"fork":false,"pushed_at":"2022-02-13T15:10:11.000Z","size":3376,"stargazers_count":30,"open_issues_count":0,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-12T21:13:21.023Z","etag":null,"topics":["big-data","cluster","gin","golang","gorilla","gossip","load-balancer","message-queue","mq","server","vue","websocket"],"latest_commit_sha":null,"homepage":"https://gitee.com/dpwgc/kapokmq","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dpwgc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-01T14:39:21.000Z","updated_at":"2025-04-13T20:12:12.000Z","dependencies_parsed_at":"2022-08-28T21:00:42.545Z","dependency_job_id":null,"html_url":"https://github.com/dpwgc/kapokmq","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fkapokmq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fkapokmq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fkapokmq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fkapokmq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dpwgc","download_url":"https://codeload.github.com/dpwgc/kapokmq/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253823462,"owners_count":21969848,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["big-data","cluster","gin","golang","gorilla","gossip","load-balancer","message-queue","mq","server","vue","websocket"],"created_at":"2024-10-24T10:05:07.847Z","updated_at":"2025-05-12T21:13:30.767Z","avatar_url":"https://github.com/dpwgc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KapokMQ\n\n## 基于Go整合Gossip+WebSocket的轻量级分布式消息队列\n\n![Go](https://img.shields.io/static/v1?label=LICENSE\u0026message=Apache-2.0\u0026color=orange)\n![Go](https://img.shields.io/static/v1?label=Go\u0026message=v1.17\u0026color=blue)\n[![github](https://img.shields.io/static/v1?label=Github\u0026message=kapokmq\u0026color=blue)](https://github.com/dpwgc/kapokmq)\n[![star](https://gitee.com/dpwgc/kapokmq/badge/star.svg?theme=dark)](https://gitee.com/dpwgc/kapokmq/stargazers)\n[![fork](https://gitee.com/dpwgc/kapokmq/badge/fork.svg?theme=dark)](https://gitee.com/dpwgc/kapokmq/members)\n\n***\n\n#### KapokMQ是一个使用Go语言实现的，单机TPS超10万的轻量级分布式消息队列\n\n#### 特点：\n\n* 部署KapokMQ无需安装任何外部依赖应用/环境，单文件应用，且配置简单，启动方便。\n\n* 支持多种消息推送方式（订阅/发布推送、点对点推送、延时消息发布）。\n\n* 消息队列与客户端采用WebSocket连接，全双工通讯，消息与ACK发送都在一条连接上，简易高效。\n\n* 集群基于Gossip构建，可自动探测集群节点，能轻易做到水平扩展、断线重连。\n\n* 具有主从节点消息同步功能，主节点宕机后，从节点可以自动接手消息推送工作。\n\n* 提供全量数据持久化方案及WAL预写日志记录，用户可在高性能与高可靠之间自由选择。\n\n* 内置网页端控制台，可直接通过网页查看消息队列的运行情况。\n\n***\n\n#### KapokMQ与Serena应用整合包下载与安装\n* https://github.com/dpwgc/kapokmq-server `github`\n* https://gitee.com/dpwgc/kapokmq-server `gitee`\n\n#### 注册中心源码 ~ Serena\n* https://github.com/dpwgc/serena `github`\n* https://gitee.com/dpwgc/serena `gitee`\n\n#### Golang客户端 ~ kapokmq-go-client\n* https://github.com/dpwgc/kapokmq-go-client `github`\n* https://gitee.com/dpwgc/kapokmq-go-client `gitee`\n\n#### 控制台前端源码 ~ kapokmq-console\n* https://gitee.com/dpwgc/kapokmq-console `gitee`\n\n***\n\n### 软件架构\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/deploy.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/inner1.jpg)\n\n***\n\n### 实现功能\n\n#### 订阅/发布推送模式：\n* 将单条消息通过WebSocket结合协程并发推送到多个与消息topic主题相同的消费者客户端。\n\n#### 点对点推送模式：\n* 如果有多个消费者客户端连接到消息队列，将消息随机推送给其中一个与消息topic主题相同的客户端。\n\n#### 延时消息发布：\n* 可对单条消息设定延时时间，秒级延时推送消息，投送时间精确度受mq.checkSpeed消息检查速度的影响。\n\n#### ACK消息确认机制：\n* 消息队列接收到消息后，将向生产者发送确认接收ACK，可确保消息不在写入WAL日志之前丢失。\n* 消费者接收到消息后，将向消息队列发送确认消费ACK，可确保消息不在消息消费环节丢失。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/ack2.jpg)\n\n#### 主从节点部署\n* 可为单个消息队列节点绑定一个从节点，从节点消息列表会与主节点消息列表保持同步。\n* 主节点健在时，从节点不会进行消息推送，当主节点宕机后，从节点会把剩余的未消费消息推送给备用消费者客户端。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/sync.jpg)\n\n#### 负载均衡集群部署：\n* 采用Gossip协议连接与同步集群节点，生产者客户端从注册中心获取所有消息队列节点地址并与它们连接，进行负载均衡投递（将消息随机投送到其中一个消息队列节点）。可做到不停机水平扩展。\n\n#### 消息推送失败自动重试机制：\n* 定期重推未确认消费且超时的消息(受mq.checkSpeed消息检查速度的影响)。\n\n#### KV型内存数据存储：\n* 采用sync.Map存储所有消息，控制台访问、消息检查、ACK确认接收/消费、全量数据持久化等一系列读写操作都在sync.Map上进行。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/kv.jpg)\n\n#### 数据持久化：\n* 方式一：周期性全量数据持久化。\n* 方式二：周期性全量数据持久化结合WAL预写日志（影响性能）。\n* （注：周期性全量数据持久化不会写入已经被消费的消息）\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/pers.jpg)\n\n#### 消息清理：\n* 自定义过期时间，定期清除过期消息，默认清除两天前的消息。\n* 通过设置可让消息队列立即清除已确认消费的消息。\n\n#### 网页端控制台：\n* 包含查看消息队列配置、生成近一周消息增长折线图、查看各状态消息数量、查看消费者与生产者客户端列表、搜索消息及查看集群节点列表功能。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page1.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page2.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page2-5.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page3.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page4.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page4-5.jpg)\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/page4.jpg)\n\n***\n\n### 单机性能测试\n\n#### 测试程序和消息队列都运行在本机。\n\n#### 配置：\n\n* 2019年的轻薄本，未充电状态，平衡模式\n\n* 4核8线程处理器：Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz\n\n* LPDDR3内存：8.00 GB (7.85 GB 可用)\n\n* 固态硬盘：WDC PC SN720 SDAPNTW-512G\n\n#### 测试程序（部分）\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/test_code.jpg)\n\n#### 选择数据持久化方式一，未开启WAL预写日志的情况下，模拟三十万并发消息插入，最高TPS可达十万。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/nowal_test.jpg)\n\n#### 选择数据持久化方式二，开启WAL预写日志，同样模拟三十万并发消息插入，受磁盘IO影响，消息插入速度存在大幅波动与衰减。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/wal_test.jpg)\n\n***\n\n### 配置文件\n\n* ./application.yaml\n\n***\n\n### 打包方法\n\n##### 安装并配置go环境\n\n##### 应用打包：\n\n* 使用build.bat一键打包\n\n```\nWindows系统下直接运行./build.bat文件\n自动执行打包命令\n生成Linux二进制文件与Windows exe文件\n```\n\n* 打包成windows exe\n\n```\n  GoLand终端cd到项目根目录，执行go build命令，生成exe文件\n```\n\n* 打包成linux二进制文件\n\n```\n  cmd终端cd到项目根目录，依次执行下列命令：\n  SET CGO_ENABLED=0\n  SET GOOS=linux\n  SET GOARCH=amd64\n  go build\n  生成二进制执行文件\n```\n\n***\n\n### 部署方式\n\n#### 在服务器上部署\n\n##### 详细部署流程\n* https://github.com/dpwgc/kapokmq-server `github`\n* https://gitee.com/dpwgc/kapokmq-server `gitee`\n\n```\n在Windows上部署\n\n/kapokmq                  # 文件根目录\n    kapokmq.exe           # 打包后的exe文件\n    application.yaml      # 配置文件\n    /log                  # 日志目录\n    /view                 # 前端-Vue项目打包文件\n    MQDATA                # 持久化文件\n    WAL.log               # 预写日志  \n```\n\n```\n在Linux上部署\n\n/kapokmq                  # 文件根目录\n    kapokmq               # 打包后的二进制文件(后台运行指令:setsid ./kapokmq)\n    application.yaml      # 配置文件\n    /log                  # 日志目录\n    /view                 # 前端-Vue项目打包文件\n    MQDATA                # 持久化文件\n    WAL.log               # 预写日志  \n```\n\n* 控制台网页端，启动消息队列后访问：\n\n```\nhttp://localhost:port/#/Console\n```\n\n***\n\n### 消息格式说明\n\n* 消息模板\n\n```yaml\nMessageCode  string   #消息唯一标识码（由消息队列生成）\nMessageData  string   #消息内容（一般为JSON格式的字符串）\nTopic        string   #消息所属主题\nCreateTime   int64    #消息创建时间（秒级时间戳）\nConsumedTime int64    #消息被消费时间（秒级时间戳）\nDelayTime    int64    #延迟推送时间（单位：秒）\nStatus       int      #消息状态（-1：待消费。0：未到推送时间的延时消息。1：已消费）\n```\n\n* 消息状态变更流程\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/msgStatus.jpg)\n\n***\n\n### 客户端连接\n\n#### Golang客户端连接工具\n* https://github.com/dpwgc/kapokmq-go-client `github`\n* https://gitee.com/dpwgc/kapokmq-go-client `gitee`\n\n#### 生产者客户端连接到消息队列\n\n* WebSocket `ws://localhost:port/Producers/Conn/{topic}/{producerId}`\n\n```\nWebSocket链接中的参数：\ntopic        //主题名称\nProducerId   //生产者客户端Id\n```\n\n* 消息队列接收的消息格式\n\n* 生产者客户端推送给消息队列的Json字符串消息格式\n\n```json\n{\n    \"MessageData\":\"hello\",\n    \"DelayTime\":0\n}\n```\n* 常规消息进入消息通道之前，状态将被设为待消费（Status：-1）。\n\n* 延时消息进入消息通道之前，状态将被设为未到时（Status：0）。\n\n* 消息队列接收到该消息后（写入日志后），通过该websocket连接向生产者客户端发送ACK，ACK内容为字符串\"ok\"\n\n* 如果生产者客户端选择异步发送消息方式，则可忽略该ACK。\n\n* 如果要追求消息的可靠性，可以利用该ACK机制发送同步消息，即生产者在发送完一条消息后，等待消息队列发来的ACK后，再继续发送下一条消息。\n\n* 消息队列发送给生产者的ACK字符串样式\n\n```json\n\"ok\"\n```\n\n#### 消费者客户端连接到消息队列\n\n* WebSocket `ws://localhost:port/Consumers/Conn/{topic}/{consumerId}`\n\n```\nWebSocket链接中的参数：\ntopic        //主题名称\nconsumerId   //消费者客户端Id\n```\n\n* 通过WriteJSON()函数将model.Message类型的消息转为Json字符串发送\n\n* 消息队列推送给消费者客户端的Json字符串消息格式\n\n```json\n{\n    \"MessageCode\":\"8c01b728ef82ba754a63e61daa43e83c61b744c7\",\n    \"MessageData\":\"hello\",\n    \"Topic\":\"test_topic\",\n    \"CreateTime\":1640975470,\n    \"ConsumedTime\":1640975520,\n    \"DelayTime\":0,\n    \"Status\":-1\n}\n```\n\n* 消费者客户端接收并处理完该消息后，通过该websocket连接向消息队列异步发送ACK，ACK内容为消息的唯一标识码MessageCode\n\n* 消息队列接收到ACK后，将指定消息的状态更改为已消费（Status：1）。\n\n* 如果消息到达超时时间（mq.pushRetryTime，默认为300秒）仍未收到ACK，将进行重推。\n\n* 消费者客户端发送给消息队列的ACK字符串样式\n\n```json\n\"8c01b728ef82ba754a63e61daa43e83c61b744c7\"\n```\n\n***\n\n### 客户端连接流程演示\n\n生产者、消费者客户端与消息队列建立连接后，需输入密钥登录\n\n#### 生产者客户端与消息队列建立连接\n\n```\nws://127.0.0.1:8011/Producers/Conn/test_topic/1\n\n服务端回应 2022-01-02 15:14:53\n\"Please enter the secret key\"   //提示输入密钥\n\n客户端发送 2022-01-02 15:15:06\n\"qqq\"                           //输入错误的密钥\n\n服务端回应 2022-01-02 15:15:06\n\"Secret key matching error\"     //提示密钥出错\n\n服务端回应 2022-01-02 15:15:06\n\"Please enter the secret key\"   //再次提示输入密钥\n\n客户端发送 2022-01-02 15:15:13\n\"test\"                          //输出正确的密钥\n\n服务端回应 2022-01-02 15:15:13\n\"Secret key matching succeeded\" //提示密钥验证成功\n\n客户端发送 2022-01-02 15:15:15   //生产者客户端可以向消息队列发送消息\n\"{.. Json SendMessage ..}\"\n\n服务端回应 2022-01-02 15:15:15   //消息队列接收到消息后，向生产者发送ACK\n\"ok\"                           //ACK内容为字符串\"ok\"\n```\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/ws_test1.jpg)\n\n#### 消费者客户端与消息队列建立连接\n\n```\nws://127.0.0.1:8011/Consumers/Conn/test_topic/1\n\n服务端回应 2022-01-02 15:14:53\n\"Please enter the secret key\"   //提示输入密钥\n\n客户端发送 2022-01-02 15:15:06\n\"qqq\"                           //输入错误的密钥\n\n服务端回应 2022-01-02 15:15:06\n\"Secret key matching error\"     //提示密钥出错\n\n服务端回应 2022-01-02 15:15:06\n\"Please enter the secret key\"   //再次提示输入密钥\n\n客户端发送 2022-01-02 15:15:13\n\"test\"                          //输出正确的密钥\n\n服务端回应 2022-01-02 15:15:13\n\"Secret key matching succeeded\" //提示密钥验证成功\n\n服务端回应 2022-01-02 15:15:13   //消息队列可以向消费者客户端发送消息\n\"{.. Json Message ..}\"\n\"{.. Json Message ..}\"\n\n客户端发送 2022-01-02 15:15:14   //消费者接收到消息后，向消息队列发送ACK\n\"8c01b728ef82ba754a63e61daa43e83c61b744c7\"  //ACK内容为MessageCode\n\"sdiw2b7quh82basdsa17sdqdqw81d83c61bqdhhu\"  //可异步发送确认消费ACK\n```\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/ws_test2.jpg)\n\n***\n\n### 主要模块\n\n##### 消息通道与消息列表 `memory/mq.go`\n\n* 使用golang的通道chan充当队列，所有主题的消息都将进入该通道，通道的缓冲空间大小决定了消息队列的吞吐量。\n\n* 使用sync.Map存储所有消息，用于数据持久化、消息检查、控制台数据获取。\n\n```\n//消息通道，用于存放待消费的消息(有缓冲区)\nvar messageChan = make(chan models.Message, messageChanBuffer)\n\n// MessageList 消息列表，存放所有消息记录\nvar MessageList sync.Map\n```\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/list_chan.jpg)\n\n##### 生产者消息接收 `server/producer.go`\n\n* 生产者客户端通过WebSocket连接到消息队列（github.com/gorilla/websocket），并发送消息到消息队列，消息被写入消息通道与消息列表。\n\n* 额外提供生产者HTTP接口，可通过HTTP请求向消息队列发送消息。\n\n接口URL:\n\u003e http://127.0.0.1:8011/Producer/Send\n\n请求方式\n\u003e POST\n\nContent-Type\n\u003e form-data\n\n\n\n\n\n请求Header参数\n\n| 参数        | 示例值   | 是否必填   |  参数描述  |\n| :--------   | :-----  | :-----  | :----  |\n| secretKey     | test |  必填 | 访问密钥 |\n\n请求Body参数\n\n| 参数        | 示例值   | 是否必填   |  参数描述  |\n| :--------   | :-----  | :-----  | :----  |\n| messageData     | hello |  必填 | 消息主体内容 |\n| topic     | test_topic |  必填 | 消息所属主题 |\n| delayTime     | 0 |  必填 | 延时投送时间 |\n\n成功响应示例\n```json\n{\n    \"code\":0, \n    \"msg\":\"cbcebdfc446e237af323098fd125c5b161b7516c\"\n}\n```\n\n##### 消费者消息推送 `server/consumer.go`\n\n* 消费者客户端通过WebSocket连接到消息队列（github.com/gorilla/websocket）。\n\n* 包含订阅/发布、点对点两种推送模式。\n\n* 消费者客户端接收消息后，将向消息队列发送一条ACK确认字符（内容为消息标识码messageCode），消息队列再根据此ACK将指定messageCode的消息更改为已消费状态。\n\n##### 数据持久化 `persistent`\n\n* 全量数据写入：定期将MessageList消息列表中的未消费消息和延时消息转换为[]byte类型数据，并写入二进制文件，类似于Redis RDB持久化方式。\n\n* 全量数据写入结合WAL日志：定期将内存中的消息全量持久化到二进制文件（不包括已被消费的消息），在两次全量数据持久化之间，每次接收或更新消息操作都将写入WAL日志，最大程度避免消息丢失。\n\n* 数据恢复：从二进制文件及WAL日志中读取数据，并将数据恢复至MessageList消息列表中，重新推送未消费的消息。\n\n![avatar](https://dpwgc-1302119999.cos.ap-guangzhou.myqcloud.com/kapokmq/recovery.jpg)\n\n##### 消息检查 `server/check.go`\n\n* 每隔一段时间遍历一次MessageList消息列表，检查其中是否有到达推送时间的延时消息、超时未消费的消息、过期消息。可重新推送消息及清除过期的消息。\n\n##### 主从同步 `syncConn`\n\n* 主从节点之间通过websocket连接同步消息。需先启动主节点，再启动从节点。\n\n* 主从节点连接后，从节点会定期对主节点进行心跳探测，如果检测到主节点宕机，从节点会自动开始推送消息给备用消费者客户端，当主节点重连后，从节点将重新关闭推送功能。\n\n##### 加入Gossip集群 `cluster/join.go`\n\n* 使用 github.com/hashicorp/memberlist 构建并链接Gossip集群服务。\n\n* 借助Gossip协议扩散同步的特性，可以随时向集群中添加新的消息队列节点。\n\n##### 控制台接口 `console/api.go`\n\n* 控制台接口：用于获取生产者/消费者客户端列表、消息队列配置信息及集群内消息队列节点列表，对消息进行查询或删除操作。\n\n***\n\n### 项目结构\n\n##### cluster 集群相关\n\n* join.go `加入指定集群`\n\n##### config 配置类\n\n* config.go `项目配置文件加载`\n\n##### console 控制台\n\n* api.go `控制台接口`\n\n##### memory 内存数据容器\n\n* mq.go `消息通道与消息列表`\n\n##### middleware 中间件\n\n* cors.go `跨域配置`\n\n* safe.go `安全验证`\n\n##### model 模板类\n\n* client.go `客户端模板`\n\n* message.go `消息模板`\n\n* node.go `集群节点模板`\n\n##### mqLog 日志记录\n\n* log.go `常规日志与WAL日志写入`\n\n##### persistent 持久化\n\n* fileRW.go `文件读写`\n\n* persData.go `持久化到硬盘`\n\n* recovery.go `数据恢复`\n\n##### router 路由\n\n* router.go `路由配置`\n\n##### server 服务层\n\n* producer.go `生产者消息接收`\n\n* consumer.go `消费者消息推送`\n\n* check.go `消息检查-消息重推与过期消息清理`\n\n##### syncConn 主从同步\n\n* master.go `主节点向从节点发送消息`\n\n* slave.go `从节点接收消息`\n\n* sync.go `主从同步初始化`\n\n##### utils 工具类\n\n* createCode.go `消息标识码生成`\n\n* localTime.go `获取本地时间`\n\n* md5Sign.go `md5加密`\n\n* toTimestamp.go `日期字符串转时间戳`\n\n##### view 前端Vue项目打包文件\n\n* css\n\n* js\n\n* index.html\n\n##### application.yaml 配置文件\n\n##### main.go 主函数\n\n***\n\n### 后期计划\n\n|实现功能|功能说明|当前进度|\n|---|---|---|\n|Java客户端|Maven包，websocket连接，Demo：https://gitee.com/dpwgc/kapokmq-java-client|未完成|\n|拉模式消费|消费者主动拉取消息队列的消息|计划中|","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpwgc%2Fkapokmq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdpwgc%2Fkapokmq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpwgc%2Fkapokmq/lists"}