小赖子的英国生活和资讯

系统设计: Steem区块链ChatGPT机器人

阅读 桌面完整版

前几天, 把ChatGPT整合到了STEEM区块链上, 但最初的设计存在缺陷. 我发现其它机器人命令(!bing, !thumbup, !price, !info) 同样也有问题, 所以就借此机会重新设计重构了一下代码和结构. 这个DApps (ChatGPT机器人) 是使用JS (Node)编写的, 并由pm2管理器托管运行在一台云服务器上(VPS Server).

STEEM区块链ChatGPT DApps设计缺陷

原先的设计:

  1. 进程(Blockchain)监听STEEM区块链上所有的帖子, 把满足条件的评论(含有 !ask 命令)的操作入数据库.
  2. 进程(ask) 或其他命令从MySQL中获取相应的记录, 并立即处理它们, 然后在同一进程中同步地发布到STEEM区块链.

这里会有一个问题, 确实来说, 大量并发会有问题. 一个STEEM帐户每3秒才能发布一次评论, 因此在大规模同时处理时会出现问题. 多人同时在STEEM区块链上调用机器人在最后面发步到STEEM区块链的时候会造成阻塞.

最简单的方法就是在发表评论的时候加入一个尝试(Retry)处理, 但这会增加进程的开销和复杂性. 此外, 这可能会导致每个机器人的代码重复.

新的设计和架构: STEEM区块链ChatGPT DApps

重新设计后, 我添加了一个 comments 进程, 只做一件事: 每3秒从MySQL表中读取需要发的评论, 发布它们并将其标记为已完成.

以下是组件的整体设计:

Steem区块链机器人系统设计图

当机器人完成处理, 例如ask进程调用了ChatGPT API返回结果时, 把评论存到MySQL表中, 而不是直接发布到Steem区块链. 所有处理过的评论(成功发布到区块链上的评论)都将记录在 logs 日志表中.

这有几个优点:

使用此设计, 被取出的消息将立即被标记为已处理, 要被发表的评论则不受此状态影响.

经过了重构, 可靠性和可用性大大提升了, 下面显示了由pm2 manager运行的进程.

PM2 Manager shows running Steem Blockchain Processes

重试逻辑/策略

目前, 该系统没有重试策略. 例如, 在 Steem 区块链上发布可能会触发错误, 由于资源单元不足或网络问题等. 当出现这种情况时, 我们可以将记录重新排队到评论表中, 或者只需更新时间戳, 以便稍后可以取出它们(按先进先出顺序, 以便在”重试”消息之前可以选择其他新消息).

在高峰时段, 免费(Free Plan)计划的 ChatGPT 可能需要一段时间甚至几分钟才能返回响应. 目前, 在 Steem 区块链上的 ChatGPT DApp 设置为 120 秒的超时时间. 如果失败, 则可能返回错误的 JSON(SyntaxError: Unexpected end of JSON input), 然后我们必须将请求重新放回数据库(队列)并更新时间戳. 在一定数量的重试之后, 我们可能会中止请求并完全失败它.

单点故障

这个设计有个问题, 就是读取的进程一旦崩溃就会造成数据丢失. 解决单点故障: STEEM区块链ChatGPT机器人的多个读进程

结论

本文介绍了 Steem 区块链上机器人(命令)的系统设计. 我们用数据库(MySQL)来持久化和实现消息队列的两个目的. 如果性是个问题, 我们可能需要考虑使用高性能消息队列 Message Queue, 而不是数据库 Database.

当前的设计克服了在 Steem 区块链上每 3 秒发布 1 条评论的限制, 并允许多个机器人(Dapps) 同时处理消息.

Steem 坐火箭🚀!

ChatGPT 可以拿来做什么?

ChatGPT 通用人工智能

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version