我们每年愚人节的传统是发起一次探索人类大规模互动的项目。今年的项目是创造一块协作画板,每个用户每 5 分钟可以填充一个像素点。这种方式降低了个人在复杂创作中的重要性,且使得大规模的协作变为必须。每个像素点都实时展示给观众。 这个项目涵盖了前后端研发和移动研发的支持,并且大部分基于Reddit现有技术实现。本文将会从技术角度详述如何实现这一项目的。 定义需求 定义愚人节项目需求至关重要,因为没有少量测试的机会,一上线即面向所有Reddit用户。如果上线功能不够完美,很难吸引足够的用户来完成这个项目并做的很有意思。 画布必须为1000*1000才足够大 所有人同时都必须看到同一画面,否则很难协作 至少支持10万人同时协作 用户每五分钟可以涂一个像素,意味着我们要支持每五分钟10万个像素点更新(333次/秒) 即便在访问高峰期也不会影响网站其它功能的正常使用 需要灵活的设置以备意外的瓶颈或者失败。这就要求画板大小和更新速度云端控制以防数据过大或者刷新过快 需要开放 API 和保持透明,如果需要,Reddit 社区才能在上面工作。 后端研发 后端的挑战在于要保证所有用户的页面实时一致。解决方案是一旦用户方接收到像素点的变更,会初始化用户页面状态,并立即向服务端请求完整的最新画板。要做到这点,我们需要保证画板完整状态的请求发送速度足够快。 API 接收全画板 填充像素 获取单像素的详情 Websockets 前端研发 跨平台无缝体验对前端有很大挑战 – 要跨越桌面端,移动网页端,atv,iOS端和安卓端。相应的 UI 需要满足 3 样条件: 实时显示画板 允许用户和画板互动 在各平台都可以进行操作,包括移动应用端 UI 的主要精力放在画板上,Canvas API 非常合适。具体工作如下: 做画板 做初始状态画板 处理 websocket 更新 与画板的互动 画板缩放 – 方便查看效果 相机控制板 – 方便移动和切换位置 对移动应用的支持 经验和教训 永远无法面面俱到,总会遗漏: 由于有个技术问题没有想得深入,在问题出现初期被忽略了,导致后来要不停的手动切换连接超时时间。 机器永远只是机器: 在项目末尾阶段,间歇性的小错误导致很多用户不断的刷新重试,从而形成了一股巨大的“重试”浪潮,系统自身无法应对这种问题,只能人工进行干预。 (责任编辑:本港台直播) |