Golang在接口开发的过程中,这两种方式哪一种更好,或者有什么问题?

新手上路,请多包涵

大家在写接口的时候,比如有这样一个场景用户浏览,需要给文章增加浏览量

  • 方案一:加浏览量这个操作,是有一个channel监听,程序一直在跑,如果浏览了帖子,新开一个goruntime往这个channel里面写入数据(ps:增加浏览量的channel可能阻塞),通知监听的channel执行
  • 方案二: 在用户请求接口返回这前的这个过程就给帖子的浏览量增加了一

这两种设计方式哪一种更好呢?我觉得第一种会更好,会不会出现什么问题呢?

阅读 2.2k
2 个回答

用户对文章的浏览请求,这个是读操作,是可以被Cache缓存(如果有的话)的,并不需要操作数据库。
增加浏览量这个操作涉及写数据库,而且通常浏览量并不要求很强的一致性和实时性,可以不必等浏览量增加操作执行完成(数据库写成功)就返回。

所以第一种方式把增加浏览量的操作异步处理,且不等待处理结果,可以降低处理用户浏览请求的处理时间,对提升性能是有帮助的。
可能需要注意的是,避免恶意或突发大量请求,导致goroutine泛滥,占用太多内存,当然这个应该在用户建立连接时就做一些流控处理。

  • 每次都新开一个goroutine的方案我觉得不太妥,如果是你给的方案中二选一,那我会选第二种。
  • 再提供一个我认为比较普遍的做法:引入redis,把浏览量数据放在redis中,异步写入。读取浏览量值时,从redis读取,显示时显示概数,比如读取到的值是1234,那就显示1.2K
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题