realtime

realtime

多功能WebSocket实时通信框架

Supabase Realtime是一款基于Elixir和Phoenix框架的开源实时通信服务器。它通过WebSocket提供广播、状态同步和Postgres数据库变更监听功能,支持发送临时消息、追踪共享状态和实时数据同步。该项目提供JavaScript和Dart客户端库,适用于开发实时协作应用和多人在线系统。开发者可使用Docker快速部署,并通过JWT进行身份验证。Realtime目前处于活跃开发阶段,持续优化性能和功能。

Supabase实时通信WebSocket数据库同步PostgreSQLGithub开源项目
<br /> <p align="center"> <a href="https://supabase.io"> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/supabase/supabase/master/packages/common/assets/images/supabase-logo-wordmark--dark.svg"> <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/supabase/supabase/master/packages/common/assets/images/supabase-logo-wordmark--light.svg"> <img alt="Supabase 标志" width="300" src="https://yellow-cdn.veclightyear.com/ab5030c0/6d81e4f0-4f74-4981-843b-c0bae82c2722.jpg"> </picture> </a> <h1 align="center">Supabase Realtime</h1> <p align="center"> 通过WebSocket发送临时消息、追踪和同步共享状态,以及监听Postgres变更。 <br /> <a href="https://multiplayer.dev">多人演示</a> · <a href="https://github.com/supabase/realtime/issues/new?assignees=&labels=enhancement&template=2.Feature_request.md">请求新功能</a> · <a href="https://github.com/supabase/realtime/issues/new?assignees=&labels=bug&template=1.Bug_report.md">报告错误</a> <br /> </p> </p>

状态

功能v1v2状态
Postgres 变更正式版
广播测试版
在线状态测试版

本仓库主要关注第2版,但你仍可以访问之前版本的代码Docker镜像。最新的Docker镜像请访问https://hub.docker.com/r/supabase/realtime。

代码库正在快速开发中,文档也在不断完善。欢迎试用并通过创建issue告诉我们你的想法。关注本仓库的releases以获取更新通知。如果你喜欢这个项目,请给我们一个星标!

概述

这是什么?

这是一个使用Phoenix框架构建的Elixir服务器,提供以下功能:

  • 广播:以低延迟从客户端向客户端发送临时消息。
  • 在线状态:追踪和同步客户端之间的共享状态。
  • Postgres变更:监听Postgres数据库变更并将其发送给授权的客户端。

更详细的概述请查看Realtime指南

这个服务器能保证消息送达吗?

服务器不保证每条消息都会被送达到你的客户端,使用Realtime时请记住这一点。

快速开始

你可以查看多人演示,它展示了广播、在线状态和Postgres变更功能。演示代码位于:https://github.com/supabase/realtime/tree/main/demo。

客户端库

服务器设置

首先,启动docker-compose.yml中定义的Postgres数据库和Realtime服务器容器。例如,你可以运行docker-compose -f docker-compose.yml up

注意 Supabase在生产环境中使用单独的数据库来跟踪所有租户。但是,为了简化本地开发,当通过docker-compose.yml启动容器时,会创建一个_realtime模式。

系统已为你添加了一个租户。你可以通过检查数据库中的_realtime.tenants_realtime.extensions表来确认这一点。

你可以通过向服务器发送POST请求来添加自己的租户。你必须更改nameexternal_id,其他值可以根据需要更新:

curl -X POST \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIiLCJpYXQiOjE2NzEyMzc4NzMsImV4cCI6MTcwMjc3Mzk5MywiYXVkIjoiIiwic3ViIjoiIn0._ARixa2KFUVsKBf3UGR90qKLCpGjxhKcXY4akVbmeNQ' \ -d $'{ "tenant" : { "name": "realtime-dev", "external_id": "realtime-dev", "jwt_secret": "a1d99c8b-91b6-47b2-8f3c-aa7d9a9ad20f", "extensions": [ { "type": "postgres_cdc_rls", "settings": { "db_name": "postgres", "db_host": "host.docker.internal", "db_user": "postgres", "db_password": "postgres", "db_port": "5432", "region": "us-west-1", "poll_interval_ms": 100, "poll_max_record_bytes": 1048576 } } ] } }' \ http://localhost:4000/api/tenants

注意 Authorization令牌使用docker-compose.ymlAPI_JWT_SECRET设置的密钥签名。

如果你想监听Postgres变更,可以创建一个表,然后将该表添加到supabase_realtime发布中:

create table test ( id serial primary key ); alter publication supabase_realtime add table test;

你可以使用客户端库(如@supabase/realtime-js)或使用本地主机上的内置Realtime检查器http://localhost:4000/inspector/new(确保端口与你的开发环境一致)开始使用广播、在线状态和Postgres变更功能。

WebSocket URL必须包含子域名(_realtime.tenants表中租户的external_id),令牌必须使用与租户一起插入的jwt_secret签名。

如果你使用默认租户,URL为ws://realtime-dev.localhost:4000/socket(确保端口与你的开发环境一致),你可以使用eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDMwMjgwODcsInJvbGUiOiJwb3N0Z3JlcyJ9.tz_XJ89gd6bN8MBpCl7afvPrZiBH6RB65iA1FadPT3Y作为令牌。令牌必须包含exprole(数据库角色)键。

环境变量

变量类型描述
PORT数字客户端/监听器可以连接的端口
DB_HOST字符串数据库主机URL
DB_PORT数字数据库端口
DB_USER字符串数据库用户
DB_PASSWORD字符串数据库密码
DB_NAME字符串Postgres数据库名称
DB_ENC_KEY字符串用于加密_realtime.tenants和_realtime.extensions表中敏感字段的密钥。建议:16个字符。
DB_AFTER_CONNECT_QUERY字符串服务器连接到数据库后运行的查询。
API_JWT_SECRET字符串用于签署通过HTTP请求管理租户及其扩展的令牌的密钥。
SECRET_KEY_BASE字符串服务器用于签署cookie的密钥。建议:64个字符。
ERL_AFLAGS字符串根据你的网络使用IPv4还是IPv6,设置为"-proto_dist inet_tcp"或"-proto_dist inet6_tcp"。
APP_NAME字符串服务器的名称。
DNS_NODES字符串在集群中运行服务器时使用的节点名称。
MAX_CONNECTIONS字符串设置WebSocket连接的软上限。默认为'16384'。
MAX_HEADER_LENGTH字符串设置连接的最大头部长度(以字节为单位)。默认为'4096'。
NUM_ACCEPTORS字符串设置将中继传入WebSocket连接请求的服务器进程数量。默认为'100'。
DB_QUEUE_TARGET字符串从连接池获取连接的最长等待时间。默认为'5000'或5秒。更多信息请参见:DBConnection
DB_QUEUE_INTERVAL字符串检查是否所有连接都在DB_QUEUE_TARGET下被检出的间隔。如果在此间隔内所有连接都超过了目标时间,则目标时间会加倍。默认为'5000'或5秒。更多信息请参见:DBConnection
DB_POOL_SIZE字符串设置数据库连接池中的连接数。默认为'5'。
SLOT_NAME_SUFFIX字符串这会附加到复制槽,允许创建自定义槽名。可以包含小写字母、数字和下划线字符。与默认的supabase_realtime_replication_slot一起,槽名应不超过64个字符。
TENANT_MAX_BYTES_PER_SECOND字符串首次创建租户时使用的每个租户支持的每秒最大字节数的默认值。默认为'100_000'。
TENANT_MAX_CHANNELS_PER_CLIENT字符串首次创建租户时使用的每个租户支持的最大通道数的默认值。默认为'100'。
TENANT_MAX_CONCURRENT_USERS字符串首次创建租户时使用的每个租户支持的每个通道的最大并发用户数的默认值。默认为'200'。
TENANT_MAX_EVENTS_PER_SECOND字符串首次创建租户时使用的每个租户支持的每秒最大事件数的默认值。默认为'100'。
TENANT_MAX_JOINS_PER_SECOND字符串首次创建租户时使用的每个租户支持的每秒最大通道加入数的默认值。默认为'100'。
SEED_SELF_HOST布尔值使用默认租户为系统播种

WebSocket URL

本地开发时,WebSocket URL的格式如下:ws://[external_id].localhost:4000/socket/websocket

如果你在生产环境中使用Supabase托管的Realtime,URL为wss://[project-ref].supabase.co/realtime/v1/websocket?apikey=[anon-token]&log_level=info&vsn=1.0.0"

WebSocket连接授权

WebSocket连接通过对称JWT验证进行授权。仅支持使用以下算法签名的JWT:

  • HS256
  • HS384
  • HS512

通过设置JWT_CLAIM_VALIDATORS来验证JWT声明:

例如 {'iss': 'Issuer', 'nbf': 1610078130}

然后JWT的"iss"值必须等于"Issuer","nbf"值必须等于1610078130。

注意:

JWT过期会自动检查。exprole(数据库角色)键是必需的。

授权客户端连接:您可以按照实时客户端库中的说明传递JWT。例如,请参阅@supabase/realtime-js客户端库的使用部分。

错误操作代码

这是可以帮助您理解部署和使用情况的操作代码列表。

代码描述
RealtimeDisabledForConfiguration提供给Realtime连接的配置将无法提供任何Postgres更改
TenantNotFound您尝试连接的租户不存在
ErrorConnectingToWebsocket尝试连接WebSocket服务器时出错
ErrorAuthorizingWebsocket尝试授权WebSocket连接时出错
TableHasSpacesInName您尝试监听的表名中包含空格,我们无法支持
UnableToDeleteTenant尝试删除租户时出错
UnableToSetPolicies设置授权策略时出错
UnableCheckoutConnection尝试从租户池中检出连接时出错
UnableToSubscribeToPostgres尝试订阅Postgres更改时出错
ChannelRateLimitReached您可以创建的通道数量已达到限制
ConnectionRateLimitReached已连接客户端的数量已达到限制
ClientJoinRateLimitReached客户端每秒加入的速率已达到通道限制
UnableToConnectToTenantDatabaseRealtime无法连接到租户的数据库
RealtimeNodeDisconnectedRealtime是一个分布式应用程序,这意味着系统无法与其中一个分布式节点通信
MigrationsFailedToRun对Realtime所需的租户数据库运行迁移时出错
ErrorStartingPostgresCDCStream启动用于Postgres更改的Postgres CDC流时出错
UnknownDataProcessedRealtime系统处理了未知的数据类型
ErrorStartingPostgresCDC启动用于Postgres更改的Postgres CDC扩展时出错
ReplicationSlotBeingUsed复制槽正被另一个事务使用
PoolingReplicationPreparationError准备复制槽时出错
PoolingReplicationError池化复制槽时出错
SubscriptionDeletionFailed尝试删除Postgres更改订阅时出错
UnableToDeletePhantomSubscriptions尝试删除不再使用的订阅时出错
UnableToCheckProcessesOnRemoteNode尝试检查远程节点上的进程时出错
UnableToCreateCounter尝试创建计数器以跟踪租户的速率限制时出错
UnableToIncrementCounter尝试增加计数器以跟踪租户的速率限制时出错
UnableToDecrementCounter尝试减少计数器以跟踪租户的速率限制时出错
UnableToUpdateCounter尝试更新计数器以跟踪租户的速率限制时出错
UnableToFindCounter尝试查找计数器以跟踪租户的速率限制时出错
UnhandledProcessMessageRealtime进程收到未处理的消息
UnableToProcessListenPayloadNOTIFY操作中发送的有效负载无法解析为JSON
UnableToListenToTenantDatabase无法监听租户数据库的通知
UnprocessableEntity收到的HTTP请求主体无法被端点处理
ErrorOnRpcCall调用另一个realtime节点时出错
ErrorExecutingTransaction在租户数据库中执行事务时出错
UnknownError发生未知错误

许可证

此仓库采用Apache 2.0许可。

致谢

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多