继续接着 上次的事 来弄
完美的做法当然是仔细的通过事务和数据锁等等来解决这个,但,大家都很忙,能有简单但有效的解决办法么?
当然。

  1. 路由处理函数随机延时,比如每次请求 sleep 0-100ms。人类感觉不大出来这个时间,人的神经线传输是0.3秒。但它就可以有效的把并发处理从时间上分散开。当然,我是指不是恶意的,只是因为不小心或者实在太凑巧了并发了。
  2. 路由函数加互斥锁,锁使用用户token或者userid等。其实绝大多数路由函数,特别是写的操作,简单的互斥锁就够了,咱们遇不到真正需要严格并发处理它的这种业务需求。
  3. 忽略掉逻辑上不可能的并发,比如,同一个用户一秒登录10次,那就只处理第一个请求,后面9个通通直接return。这一方面是解决并发,一方面也是防止cc。

有的时候,不想把自己的telegram号给别人,用个机器人来转发就很有必要了
@LivegramBot是实现同样功能的,不过,本着折腾精神,自己写一个。
原理就是,机器人会把收到的消息转发给自己的主号,主号回复的转发消息,提取出来文字/图片/视频后把它发给消息的原始发送者。
偶尔会crash掉,还有待继续debug,找到crash的地方。

**crash原因已发现,如果用户在隐藏模式下,就是禁止group转发时,无法获得原始的转发人id故而出错。明天发修正的源码。

逻辑: tgfwd.go

TG接口: telegram.go

配置文件: bot.yaml

先执行select sn from xxxx where oid=xxxx, 找指定的oid的记录,如果错误,就是记录不存在(数据库挂了?不可能的啦。。),然后既然不存在,那就新增对应oid的一条记录。这是常用的如果有就读出来没有就创建新记录的机制。
逻辑和流程没问题?
笑话,大力出奇迹,板砖也能飞上天!
同时并发一堆这请求,只要力气够大速度够快,大家都可以同时在select还没来得及insert的时候进入if err!=nil,就产生了一堆相同oid的记录。
啥?没这么巧?系统因为这个重复一大堆,现在都还不知道怎么擦这屁股。。。

dl.jpg

还好,只是短信和cos受影响,我们的用户的app大都一直登录着的,不需要发短信验证码,然后cos的东西都被cdn缓存着的。所以,实际上对我们没影响。不然今天要烦死。

err1.png
err2.png

虽然这blog也没指望人来,不过google/bing的蜘蛛也都不来,这很奇怪啊。
外链少,但是是有的,我把它加在一个高权重站里的,然后去google站长工具里面提交,连sitemap.xml它都不读,直接返回错误。
难道这个域名先前有恶劣的历史吗?

**后记: 更换成一个老域名后,google/bing基本都是瞬间就来了。不过,那是个备案过的域名,不敢造次,新注册了这个org看看了,以前是用的xyz,也许是这个问题吧。