使用LeanCloud替换MongoDB
在 Wordpress 迁移到 Hugo 中寻找评论解决方案时,发现 valine 使用的云存储平台 LeanCloud 提供的数据模型与 MongoDB 类似,并且提供的免费资源(日操作低于30000次)足够个人博客等小型网站使用。
单位业务监控的外网服务器 nmp-web 搭建在我自己购买的阿里云服务器上,使用 MongoDB 和 Redis 存储数据。因为 MongoDB占用的资源较多,云服务器只有1G内存,MongoDB 经常因查询而崩溃。保存到 MongoDB 中的数据访问量很少,LeanCloud 的开发版完全可以满足需求。所以,已经使用 LeanCloud 替换 MongoDB,降低云服务器的负载,同时也是对 Serverless 的一种尝试。
数据模型
LeanCloud 的存储后台大量采用了 MongoDB 这种文档数据库来存储结构化数据。
MongoDB 的数据结构可以直接保存到 LeanCloud 中,与 MongoDB 不同的是,LeanCloud 的一个 Class 中的数据必须有相同的格式。
nmp-web 接收的 json 数据是来自 pymongo
的 BSON 转成的字典对象,具有相同的结构,可以保存到 LeanCloud 的一个 Class 中。
存储
为了检索方便,将其中的 timestamp
数据重新解析成 LeanCloud 可以识别的 datetime
格式。
def save_blob(blob: dict) -> None:
b = Blob()
blob['timestamp'] = datetime.datetime.strptime(blob['timestamp'], "%Y-%m-%dT%H:%M:%S")
b.set(blob)
b.save()
检索
检索也非常方便,例如按照 ticket_id
检索某个数据。
def get_blob(ticket_id: int) -> Blob or None:
query = leancloud.Query(Blob)
query.equal_to('ticket_id', ticket_id)
query_list = query.find()
if len(query_list) == 0:
return None
return query_list[0]
局限
LeanCloud 对单个对象 AVObject
(即 MongoDB 中的文档)限制不能超过 128 KM,远远低于 MongoDB。因此,过大的对象只能采用文件 AVFile
的方式保存到 LeanCloud 中。
AVFile
文件的保存和下载不同于对象,每日只有免费的 500MB HTTP 流量,不适合替换项目保存在 Redis 中定时更新的数据。这部分数据或许该寻找另外的存储方式与 AVObject
相结合。