搜索 “#${user.id}` ,比如 `github” ,共找到 1 项结果
×
  • Falcon
    09-15 23:39
    #Cloudflare# 踩了不少坑,比如它家的KV db 是有延迟的,各节点之间需要时间同步,才能达到最终一致性,我做了一个todolist练手,而且这个 todolist 支持用户注册登录,为了追求简单,用户信息、sessionKey和todo任务 的内容都保存KV里。
    在同步用户任务信息的时候,我才发现同一个用户,如果一个设备是手机,另一个设备是用电脑,他们就很有可能读取到不同的任务状态,比如我在手机上删除了一个任务,在电脑上该任务还是没有删除情况。我开始还怀疑是我的代码出了问题,debug到了三四点,后来我才发现原来是这个kvdb的问题,它是分布式的,会把一个节点的数据同步到其他节点,就像cdn,节点间的同步是有延迟的,所以会产生脏读的情况。但是最终会达成一致性,文档是这么说的。
    这种不一致性在某些场景是可以接受的,所以用来存session没什么问题,但问题在于如果追求强一致性,比如聊天应用,视频对话,就不能用kvdb了,它们推荐的方式是用Durable Objects,所以我又替换成了Durable Object,在next.js里写了又出现错误,后来又一查,原来这个开付费计划才能用,每月至少20刀。
    搞了半天又白搭,我又检查了一下D1是否可靠,看来也不行,看来也存在节点复制的延迟。
    准备集成 upslash的redis了,我知道这玩意可以做单点,指定一个区域,不过似乎也支持多节点复制。
    又发现一个大坑,在绑定#upslash#的时候,要在浏览器隐私模式下绑定,不然它会通过Auth0(用chatgpt的话)自动登录Google,怎么也绑定不到新的 upslash 账户。
    绑定后得到两个环境变量:
    UPSTASH_REDIS_REST_URL
    UPSTASH_REDIS_REST_TOKEN 
    会绑定到cloudflare生产环境(但加密),也可以登录upslash  redis管理面板复制其值。
    update:
      我以为没有坑了,没想到又遇到一个,是关于upslash的,我先前设置用户的key是这样的 `${user.loginMethod}#${user.id}` ,比如 `github#123` ,但是坑就在这里,如果是kv用这种key没有关系,但upslash的是通过rest_api更新的,key会作为url的一部分,#在url上有特殊用途,如果正常解析,后面的内容会因为#被截断,upslash也没想到有人会用 `#` 做key的,没有兼容处理。改成用@连接!