惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
Help Net Security
Help Net Security
腾讯CDC
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
B
Blog RSS Feed
Forbes - Security
Forbes - Security
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
P
Proofpoint News Feed
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
MyScale Blog
MyScale Blog
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
W
WeLiveSecurity
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
罗磊的独立博客
The Last Watchdog
The Last Watchdog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
美团技术团队
Microsoft Security Blog
Microsoft Security Blog

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
增强 Roblox Studio 的互操作性
种瓜 · 2023-08-14 · via 夜行人

前言

在 Roblox 中探索自主 Agent 里提到:

Roblox 不容易与其他系统进行双向通信,Roblox 社区里没有令我们满意的解决方案。我们最终动手打造了自己的方案。这个话题,会在另一篇文章里单独讨论,我们相信它对 Roblox 社区有独特的价值。

这篇文章将讨论这个话题。

消息通信

构建优秀且可扩展的系统的关键更多的是设计模块之间如何通信,而不仅仅是设计其内部属性和行为。 – Alan Kay

Alan Kay 认为对象之间的通信,是"面向对象"概念的核心构成部分(现代的 OOP 忽视了这点),他的许多观点,一直是我们灵感的来源。

Roblox 有多种方式与外部系统通信

HttpService(注意不是 HTTP Server !) 允许 Roblox 脚本发送 HTTP 请求(作为 HTTP client)。

Roblox 是一个"云"优先的软件(不是本地优先)。Roblox 的 Cloud 提供了许多 HTTP API, Messaging Service API 看起来是不错的消息传递接口。 它对外提供了 HTTP 端点(HTTP Endpoint) , 可以接收外部系统发送到 Roblox 游戏中的事件。此时,外部系统充当 HTTP client,而 Roblox 充当 HTTP Server。 需要注意的是,这个机制只支持 Roblox 已经上线的游戏(experience), 不支持在 Roblox Studio 中使用(因为 Roblox Studio 不在云端)。Roblox 的许多设计,都把"云"作为一等公民,这导致了许多功能都与云端强制绑定,引起了Roblox 用户社区的大量不满

利用以上两种机制,似乎可以在 Roblox 中构建与外部系统双向通信的模型:

  • HttpService: 消息流出 Roblox
  • Messaging Service API: 消息流入 Roblox

既然消息可以流入和流入,好像就可以在 Roblox 里构建基于 Actor 计算模型的 Agent。要实现 Actor 只需要实现这样的计算实体:

  • 响应收到的消息
  • 发送消息
  • 创建更多 Actor

以上三点都可以在 Roblox 里做到。

Roblox Studio 与 Roblox experience

“可以在 Roblox 里做到” 是个模糊的话语。

作为玩家,“Roblox” 通常意味着 “Roblox experience”,“experience”(体验) 的意思是已经发布上线, 玩家可以"体验"的游戏,之所以称为"体验",而不叫"游戏",是因为 Roblox 团队认为 Roblox 社区上线的项目有许多类别,不仅限于游戏。

对于创作者,Roblox 更多意味着 “Roblox Studio”,类似于 Unity 那样的游戏开发环境,但强调易用性。 “Roblox experience” 是创作者在 “Roblox Studio” 中创造出来的东西。

前边说通过消息的流入(Messaging Service API)和流出(HttpService), “可以在 Roblox 里” 实现消息的双向通信,是指可以在 Roblox experience 中做到。

Roblox Studio 无法收到 “Messaging Service API” 流入的消息。

解决方案

让任何人在任何地方都能创造任何东西 – Roblox 团队

Roblox 团队致力于将 Roblox Studio 打造为 “世界上最容易使用的 3D 开发工具”。

我们确实如 Roblox 团队期望的,将 Roblox Studio 当作 “3D 开发工具”, 用它进行 3D 世界的实验和探索。Roblox Studio 有着出色的实时编程(Live coding)体验,甚至具有 Smalltalk/Scratch 的 liveness(活性), 这是非常令人惊艳的。

由于我们把它当作开发和实验环境,很自然我们会想要它能够与其他系统互操作,但它的互操作性并不好。这是他们 “云端优先” 的理念造成的。

社区的解决方案

不只是我们,社区里也经常有将 Roblox Studio 连接到外部系统的需求。用户社区提议 Roblox 支持 websocket,Roblox 团队不做回应。人们只好通过一些 hack 手段做到,这些机制大多数建立在官方的HttpService机制上,所以不大有向后兼容的风险。

诸如 rojo 希望让 Roblox 开发人员能够使用专业级软件工程工具,他们的实现方式是,充分利用了 HttpService。通过维持一个长时间的 HTTP 连接(超时重连),将文件变更推送到 Roblox Studio 里。

rblx-unisocket3 也利用 HttpService 建立了一个双向通信机制,提供的 API 类似于 websocket。

我们的解决方案受到这两个项目的启发。

我们的解决方案

早期的架构图:

早期我们使用了前文提到的 HttpService 和 Messaging Service API 来与 Roblox 环境互操作,这样的坏处是,只能用于 “Roblox experience”, 而无法在 “Roblox Studio” 里使用。Messaging Service API 还有其他的坏处,诸如对消息的速率限制得厉害。

在 Roblox 中探索自主 Agent 提到,我们倾向于对系统持不可知论,并遵循端到端原则,一切都只是流动的异步消息。

关键想法是,网络应该尽可能保持愚蠢,它只是消息的公路,让消息走哪条路,或者让它在路上停上半小时再出发(只影响了抵达时间),都不会造成任何功能上的影响。

这样一来,我们可以轻松在系统里,构建各种消息的处理器: 转发器、观察器、模拟器…

受到 rojorblx-unisocket3 的启发,我们很快构建了一个消息转发器(forwarder), 在消息传递(异步)架构里这样做相当容易.

转发器的工作方式是这样的:

Roblox 中有一个 service 脚本,跑 loop 循环,发送 HTTP 请求连接到转发器上,转发器维持这个 HTTP 连接,一旦消息队列里有其他 Agent 发往 Roblox Agent 的消息,就返回连接的 HTTP 请求。转发器实际上是一个带有消息缓存队列的路由器。

你可能会问,这里允许 Roblox 主动获取"流入"的消息,但如何往外部"流出"消息? 你可能提议,在需要时往 HTTP 请求里携带"流出"的消息即可。这样做是可行的,但由于 DynaTalk 本身可以接收 HTTP 消息(转化到 DynaTalk 内部消息系统),所以我们不需要在转发器里实现。

这个机制同时适用于 Roblox Studio 与 Roblox experience! (用于Roblox experience时,只需要将转发器部署到公网上即可)

这个机制相当通用,任何兼容 DynaTalk 消息协议的系统都可以于Roblox互操作! 几乎可以在任何计算环境里实现,无论是主流编程语言、浏览器环境还是物联网系统。

这个机制相当快速(虽然基于 HTTP):

1 秒钟的时间里投递了 100 条消息!而且是在没有任何优化的情况下。

这个机制非常简单。Roblox 部分的代码一共 50 行不到: 处理了连接超时,连接失败等粗糙边缘。转发器的核心代码才 10 多行。

这个机制非常健壮,转发器与 Roblox Studio 究竟谁先启动,或者任意一方的终止/重启,都不会造成意外。我目前没有遇到过任何边缘问题。

由转发器引发的想法

转发器的架构图(我喜欢用视觉思考),让我想到,既然一切都只是消息,那么转发器是不是真的将消息转发到 Roblox 是不重要的,它完全可以伪装成 Roblox。 而 DynaTalk 消息空间中的其他 Agent 对此一无所知!(前头提到的不可知论发挥作用了)

这导致我们制作了 Roblox 模拟器(核心代码和转发器一样简单),我们只需要让转发器像 Roblox Agent 那样收发消息,其他 Agent 就会以为自己在与 Roblox 交互(不会有任何可分辨的区别),这大大增加了开发效率,开发 DynaBrain 的时候,不再需要每次打开 Roblox Studio 这个大家伙了!

模拟器让我们可以轻松进行调试,可以隔离和模拟系统的任意部分!

转发器和模拟器机制都相当通用,未来可以利用类似的机制,往这个"愚蠢"的消息网络里透明添加各种东西。

这些实际上是消息传递架构的内在力量。

参考