{"id":49815494,"url":"https://github.com/tarena-tech/tarena-pigeon","last_synced_at":"2026-05-29T21:00:52.725Z","repository":{"id":49759539,"uuid":"506835544","full_name":"tarena-tech/tarena-pigeon","owner":"tarena-tech","description":"信鸽-与非科技开源消息中台","archived":false,"fork":false,"pushed_at":"2022-12-09T03:40:12.000Z","size":1882,"stargazers_count":67,"open_issues_count":8,"forks_count":22,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-04-17T09:31:48.366Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","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/tarena-tech.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-06-24T00:59:27.000Z","updated_at":"2024-03-29T16:03:02.000Z","dependencies_parsed_at":"2023-01-25T11:31:22.039Z","dependency_job_id":null,"html_url":"https://github.com/tarena-tech/tarena-pigeon","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tarena-tech/tarena-pigeon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarena-tech%2Ftarena-pigeon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarena-tech%2Ftarena-pigeon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarena-tech%2Ftarena-pigeon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarena-tech%2Ftarena-pigeon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tarena-tech","download_url":"https://codeload.github.com/tarena-tech/tarena-pigeon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarena-tech%2Ftarena-pigeon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33670211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-05-13T06:00:43.980Z","updated_at":"2026-05-29T21:00:52.718Z","avatar_url":"https://github.com/tarena-tech.png","language":"Java","funding_links":[],"categories":["消息中间件"],"sub_categories":["微服务框架"],"readme":"# tarena-pigeon\n信鸽-与非科技开源消息中台(Message Notify Middle Platform)\n\n# quick start\n## maven build \n直接通过以下命令一键构建\n```$xslt\nsh build\n```\n## 项目部署\n- 启动后台管理系统mnmp-admin\n- 启动调度服务 mnmn-schedule\n- 启动消息passport 用户系统（信鸽支持简单用户系统，支持第三方接入）\n- 启动consumer MQ消息端（目前只支持rocket mq） \n- 启动mnmp-provider 实时接口服务\n\n\n# 架构\n概要设计\n## 背景\n### 中小企业IT架构一般形式\n![中小企业IT架构一般形式](document/old-style.svg)\n### 项目目标\n每个业务方都需要对接一次后端消息供应商服务，而且对于延迟消息和周期消息需要定制开发。而对于以上业务场景在很多行业中都存在对接多个供应商场景，开源的目的为以上问题提供统一解决方案，统一入口，并提供稳定、可靠、高性能、易用的消息中台服务。\n## 架构设计\n通过消息中台统一各业务发送入口，协调各消息供应商服务，降低业务方调用成本，简化使用方调用方式。统一保障系统稳定性。\n### 业务架构\n![业务架构](document/business.svg)\n\n\n### 模块全景图\n![模块全景图](document/all-view.svg)\n\n\n### 用例描述\n![用例描述](document/case.svg)\n\n\n### 业务流程\n#### C端实时接口业务流程\n![client flow](document/client.svg)\n\n\n#### 后台消息调度\n![backend flow](document/backend.svg)\n\n\n# 详细设计\n## 功能服务拆解\n### 消息服务\n 承接C端实时请求，如验证码、警报短信，提供所有消息发送能力。\n- 支持网关流量控制，保障接口服务稳定。\n- 保证消息及时触达用户。\n  1. RPC接到消息后优先直接发送，减少延迟。\n  2. 为避免离线消息堆积影响及时消息延迟，需要将离线和及时消息分开解耦。\n- 根据机器负载支持并发线程数配置，超出负载则通过mq 削峰。\n- 支持消息状态跟踪\n### 调度服务\n实现延迟消息和周期消息的统一调度。\n- 支持延迟消息及周期消息发送。\n  - 支持目标存储。\n  - 支持消息状态跟踪。\n- 单机调度。\n- 支持消息重试及幂等消费。\n### 后台管理\n实现消息中台、调度、监控等基础数据维护。包括消息模块管理、签名管理、供应商管理、业务方管理、消息调度信息配置等等。\n- 业务方接入管理\n- 供应商管理\n- 签名管理\n- 模板管理 \n- 任务管理\n- 消息状态管理\n### 消息消费\n消费MQ的消息并调用统一分发逻辑，实现对不同供应商的消息支持。\n## 非功能性详细设计\n### 模块划分\n依赖抽象接口不依赖具体实现，实现模块解耦，方便后续功能扩展，比如可以更换mysql存储（考虑大并发场景下的存储选型）\n### 监控\n提供monitor 埋点支持，对接prometheus\n### 消息分发\n提供对接第三方供应链的统一接口与对应实现，消息实际发现组件。以jar 包形式提供给各应用服务。\n### 存储\n提供抽象存储能力，可以对接mysql clickhorse hbase es 等多数据源。\n主要用于基本业务数据存储（mysql）\n流量统计与监控(redis tair 等)\n统计分析报表(clickhorse)\n### 业务指标监控\n1. APP每天调用接口总次数限制\n2. 手机号每天发送次数限制\n3. QPS流控\n4. 并发流控\n\n### 限流支持-[sentinel](https://github.com/alibaba/Sentinel)\n1. 项目采用sentinel流控框架,考虑成本因素,该系统默认使用json文件形式配置接口限流,使用者可自行扩展\n1. **provider**工程中使用限流,配置在application.yaml中的alibaba.sentinel.config.path配置\n1. 目前仅实现qps,并发和对手机号限流,限流文件可见**FlowRule.json**,**ParamFlowRule.json**\n1. 具体使用可见sentinel使用说明\n\n### 短信模版使用\n\n1. 例如用户在一些短信平台申请了一个通用模版\n\n2. 我们要发送的短信内容如下\n\n    `hello:${name},您于${time},有${courseName}课`\n\n3. 我们新建短信模版,模版内容如上\n\n4. 然后就是发短信流程,我们新建task任务\n\n5. 新建任务时会下载个模版excel,target为目标手机号,第二个param就填写json形式的内容\n\n6. json内容对应短信内容的三个字段, `{\"name\":\"zhangsan\",\"time\":\"2022-03-03 11:30\",\"courseName\":\"语文课\"}`\n\n7. 具体实现代码如下\n\n8. ```java\n    DollarPlaceholderReplacer dollarPlaceholderReplacer = new DollarPlaceholderReplacer();\n    Json json = new FastJson();\n    dollarPlaceholderReplacer.setJsonProvider(json);\n    Map\u003cString, Object\u003e param = new HashMap\u003c\u003e();\n    param.put(\"name\", \"zhangsan\");\n    param.put(\"time\", \"2021-11-11\");\n    param.put(\"courseName\", \"语文\");\n    // content 是发个供应商的具体内容\n    String content = dollarPlaceholderReplacer.buildContent(\"{\\\"content\\\":\\\"hello:${name},您于${time}有\t\t\t\t\t${courseName}课\\\"}\", param);\n    ```\n\n    \n\n\n### 分层领域模型规约定义\n根据阿里工程架构规范，并结合实际应用场景，考虑代码的可读性，可维护性并满足迪米特原则的前提下，兼顾开发维护成本。将请求响应参数定义区分，详细明确分层模型定义。\n- 结果实体\n  - service层以DO BO(DTO)结尾  \n  - mananger层DO BO(DTO)结尾  \n  - dao层以DO BO结尾  (单表的某些字段)\n  - RPC接口传输层以DTO结尾  \n  - controller层传递给页面以View结尾 \n- 请求实体类：  \n  上层向下层提交请求的时候，如果没有封装成对象，则用Param结尾的实体\n  写请求：  \n  - controller层Param结尾\n  - service层DTO BO(Param)结尾  \n  - mananger层DO(Param)结尾  \n  - dao层DO结尾  \n  查请求  \n  - controller层Query结尾  \n  - service层Query结尾  \n  - mananger层Query结尾  \n  - dao层Query结尾  \n\n\n协作流程\n---\n![协作流程](document/flow.png)\n\n开发文档\n---\nhttp://localhost:8080/doc.html#/home\n\nSQL脚本\n---\n./pigeon.sql\n\n注意申请阿里及华为云短信，修改access key 相关配置\n\nRELEASE-NODE\n---\n[1.0.1](document/release/1.0.1.md)\n[1.0.2](document/release/1.0.2.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarena-tech%2Ftarena-pigeon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftarena-tech%2Ftarena-pigeon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarena-tech%2Ftarena-pigeon/lists"}