如何处理短期高并发写的问题,比如在一个消息刚刚发布的时候会有大量的点赞

2014-01-09 01:50:36 +08:00
 aisensiy
如题所述,如果我使用的是 flask 这样的框架,需要如何调优这样的性能问题呢
7497 次点击
所在节点    Python
17 条回复
helone
2014-01-09 01:58:43 +08:00
压力来自数据库吧?
virushuo
2014-01-09 02:46:42 +08:00
把热点放在内存通常都能解决,大到内存解决不了的问题考虑mapreduce方式分布。
beordle
2014-01-09 02:56:00 +08:00
这种需求本来最好在python里面完成,加上一个计数变量x,定时写入数据库。不过稍微大一些的python项目可以说是类似tornado的那样多个进程的架构了,进程间内存不能共享,所以python本身基本不能解决或者说代价比较大。必须使用memcache和redis这样的有独立进程的缓存程序。

如果直接操作数据库,点赞300次。就要 读 锁 写 各300次。性能非常差。如果加一个redis 的话。其中有一个定时dump机制,非常适合高并发。读写都在内存中。每隔一段时间才会写入硬盘。性能高2个数量级。

具体的实现 可以这样,写一个 给 get set都弄上一个 装饰器。连接到 redis的 incr就行了
beordle
2014-01-09 02:59:19 +08:00
说的是具体实现,可能不太详细 把 python函数装饰器实现cache python的redis库 redis的incr文档 这些关键字google一下就行了。
chenniaoc
2014-01-09 06:57:22 +08:00
redis弱点是单线程,是个瓶颈.
cloudzhou
2014-01-09 09:51:03 +08:00
@chenniaoc 单线程不会成为瓶颈的,这个和网络复用有关,nginx也是单进程模式,当然你可以开启多个。
这个问题应该不难,redis生成临时计数器,按照一定时间回写到数据库。
emohacker
2014-01-09 10:04:20 +08:00
@chenniaoc 多线程也有多线程的弊病,线程间的切换也是有开销滴,开发也没单线程来得纯粹,总之单线程也有单线程的好处,木有绝对完美滴解决方案,性能的优化都是基于实际需求遇到的困难为出发点的。
vietor
2014-01-09 10:18:07 +08:00
做一个Command队列,牺牲实时性
akira
2014-01-09 10:34:51 +08:00
队列+内存数据库
est
2014-01-09 12:28:58 +08:00
统计多少次赞容易,但是每个人点一下一条行为记录就麻烦了。
Livid
2014-01-09 13:20:57 +08:00
@est 可以用 Redis 的 SET 类型。
aisensiy
2014-01-09 14:31:09 +08:00
@est 这个是要记录的呀
arzusyume
2014-01-09 19:42:27 +08:00
前阵子在解决某站点高并发投票的问题
程序本身是 PHP+MySQL.所有的写操作(投票/PV/验证码session)都完全交给了 memcache,
IP日志的分析交给nginx去拦截刷票.
大概是每2分钟用 crontab 触发一个 php 把 memcache 的内容写入 MySQL 中.(一开始想直接全部读出写入,结果抛了个事务锁错误OTL, 改成每次读写XX条)
此外验证码也可以优化成预生成,不过考虑成本没去做

好吧说了半天和python无关的,总之就是尽可能的减少IO次数,多用缓存,减少计算量
aisensiy
2014-01-09 20:08:20 +08:00
@arzusyume 谢谢你的回复,这个解决方案确实和 web 开发的语言关系不是很大。不过你说的 一开始想直接全部读出写入的事物锁错误OTL 我没懂...
arzusyume
2014-01-10 09:27:41 +08:00
@aisensiy 当时犯的2...直接把缓存的数据全部入库结果数据库挂了,后来改成类似队列的方式了
aisensiy
2014-01-10 19:31:58 +08:00
@arzusyume 你缓存的数据很多的样子
no13bus
2014-07-27 14:05:49 +08:00
@akira celery+redis?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/96239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX