Project Icon

realtime

多功能WebSocket实时通信框架

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


Supabase 标志

Supabase Realtime

通过WebSocket发送临时消息、追踪和同步共享状态,以及监听Postgres变更。
多人演示 · 请求新功能 · 报告错误

状态

功能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许可。

致谢

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号