节点身份系统设计
在家用环境中,每个成员都想拥有更多的计算资源,每个成员都想给更多自己的朋友提供API服务。
但这种扩张不能继续下去,给朋友的朋友的计算资源的优先级将会降低(除非你使用自己的身份代为调用)。
节点和身份的功能设计
身份指存储于加密的本地文件中的公私钥密钥对。
节点指运行的worker服务,每个节点在启动时都需要一个机主身份。
节点可以提供运行任务,任务是创建者身份、参数、节点条件的三元组。
任务发起流程
在发起任务时,创建者使用公钥签发令牌1,发布给节点的节点列表中的所有满足节点条件的节点。
仅当三元组的值均满足某节点的条件时,该节点才会接受此任务,并在令牌1上签发令牌2,发送给创建任务的节点。
在收集完可接收任务的节点列表时,在令牌2上签发令牌3,再发送任务运行请求给这些节点中的一个或多个。
- 这里会存在贪婪节点恶意浪费的问题,如果这个任务理应只需要一个节点完成。这些需要运行某个任务的节点们会发送广播包向其他节点询问是否有 hash 相同的任务被调用。如果有的话对方会回复自己的令牌3使该节点相信,并且这两个节点都会拒绝运行任务(禁止脚踏两条船,惩罚渣男)。
- 但是仅凭hash相同的策略并不能减少性能浪费——创建者依然可以创建多个参数近似(只有时间戳或某个无关紧要的参数有差异)的任务。因此,可以引入token机制来限制贪婪的节点的过多的请求。
该节点在完成检查后如果将要运行任务,则会在令牌3上签发令牌4并发送给创建者,随后双方建立tls连接来传输事件流。
- 连接中断指心跳包超时。维护心跳连接的正常对于任务的暂停、中止、提供去重key存储桶在多节点之间同步更新是非常重要的。
- 任务应当自行决定(或是决定要求创建者决定)当此连接中断时的执行策略。不应当无条件的无限执行下去。