BING
Surmon's digital garden
OG

小物件儿们

4,068 characters, 10 min read2022/02/21 AM4,668 views

最近一个月的几个小物件。

#1. mongodb-data-api

这个项目是大概在新年初二左右发布的,主页在 mongodb-data-api

正如之前提到的 README.md 项目,项目初期,我在基于 MongoDB Cloud Atlas 的免费云数据库实现了 counter 访问计数能力 之后,很快遇到了瓶颈:

  • Vercel Serverless 的冷启动大概需要 2~4s 左右的时间
  • Vercel 的免费机器只限于美东区域,且并未暴露状态持久连接的能力,连接位于 HK 的 MongoDB 大概又需要 2s
  • counter 业务需进行两次必要的 GitHub GraphQL API 写操作
  • Vercel Serverless 的免费机器只有 10s 的超时时间

综上原因,导致一个 counter 请求挂掉的概率超过了 50%,更别说高 QPS 可用性了。

并没找到好办法,研究了 MongoDB Cloud 的访问策略控制能力之后,我决定将集群从 HK 迁到美东。 在迁移的过程我发现 MongoDB Atlas 已经推出了 Data API 的 Beta 版,是 2021 年 11 月才对外开放的。 简单研究了下,发现这玩意简直就是完全为 Serverless 打造的;将数据资源 HTTPS 化,所有的数据操作完全变成了 HTTP 请求,虽然还有点小缺陷,无法支持细粒度的权限控制,一个 API KEY 可以访问整个集群所有库的所有数据,不过没关系,后面肯定会迭代和升级。 如此便很完美了,去 GitHub 看了看,相关信息寥寥无几,直接调用的话,TS 类型方面非常不友好,于是我决定,那就自己动手再造一个轮子吧。

所以调研成果大概是:

  1. Vercel 官方并没有给出什么好的解决方案,与 MongoDB 官方提供的 Serverless 解决方案 一致,都很拉胯
  2. Vercel 官方正在与 MongoDB Cloud 合作开发基于 Serverless 的插件,但目前未开放,并不可用
  3. Mongodb Cloud Atlas 官方提供了 基于 HTTPS 的 Data API
  4. Mongodb Cloud Atlas 的免费集群同样有美东区域可用

于是我做了这几件事:

  1. 迁移原 HK 的 Mongodb 免费集群至美东区域(离 Vercel Serverless 最近的机房)希望能尽可能 “快” 一些(事实证明确实快了很多,大概只需要 800ms 之内就能完成连接响应)
  2. 我基于 MongoDB Atlas Data API 包装了一个 Node.js 版本的 SDK mongodb-data-api 并发布在 NPM,并 应用在 README.md 项目中

最终,效果很不错! counter 接口有求必应!

如果你有在 Serverless 访问 MongoDB 的需求,可一定要来试试!

其实 MongoDB Atlas 的 HTTP Data API 可以看做专为 Serverless 设计的一种数据消费能力,我想 Vercel 官方正在开发的插件应该也是差不了太多的。

#2. NodePress

重构,重构,还是重构。

之前的 queryparams.decorator 的设计实在是太拉胯了,职责不明,不同作用域的上下文逻辑互相耦合,于是用基于 class-validatorclass-transformer 将原有的 Schema Validate、Permission Validate、Guest default value,能力分别抽象为了 Pipe 流的实现。

以及 NodePress 做了非常多的细节的优化和改动,当然这些都一一更新至 设计文档 了。

#3. Surmon.me

1. 流媒体

调研了一些资料,期待将播放器从网易云迁到 Spotify,但是 Spotify 好牛逼啊,各种黑科技限制你 “无登录用户 Token 在哪听啥都是 30 秒”,算了,放弃了,也就是 BGM 听个响,如果你对歌单有兴趣可以关注 这里这里

但是播放器的 UI 和交互我还是重新设计了的!

播放器开关
播放器开关
播放器面板
播放器面板

2. 聚合日历

之前的 GitHub contributions calendar 怎么看都不顺眼,很难调教。

于是:

  1. 我用基于 aggregate 的能力实现了查询 NodePress 文章日历的 API,可以以日期的形式统计每个当日的内容发布量。
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
public getCalendar(publicOnly: boolean, timezone = 'GMT') { return this.articleModel .aggregate<{ _id: string; count: number }>([ { $match: publicOnly ? ARTICLE_LIST_QUERY_GUEST_FILTER : {} }, { $project: { day: { $dateToString: { date: '$create_at', format: '%Y-%m-%d', timezone } } } }, { $group: { _id: '$day', count: { $sum: 1 } } }, { $sort: { _id: 1 } }, ]) .then((calendar) => calendar.map(({ _id, ...r }) => ({ ...r, date: _id }))) .catch(() => Promise.reject(`Invalid timezone identifier: '${timezone}'`)) }
  1. 在 Surmon.me 的 BFF 层分别借助 Twitter、Instagram 的 OpenAPI,和 GitHub 的 contributions API 分别实现了:推文、Instagram 发帖、GitHub 编码提交量的日历查询。

于是最终,是这样一个聚合日历,你可以在 PC 端访问 About 页面查看。


就这么多,接下来我要做别的事了。

完。

Creative Commons BY-NC 4.0 https://surmon.me/article/197
3 / 3 comments
Guest
Join the discussion...
  • Surmon
    Surmon🇨🇳CNShanghaiMac OSChrome

    得到了真大佬的一个赞,整挺好 😃 。

    • 遨游星海
      遨游星海🇨🇳CNHangzhouAndroidWeChat

      reply:

      真厉害👍

       这不得好好奖励自己,吃顿大餐啥的๑乛v乛๑

    • 遨游星海
      遨游星海🇨🇳CNHangzhouAndroidWeChat

      reply:

      救命,表情符号被迫换行了。😱 

      没登录,删不了了,这得逼死强迫症。😅