从评论系统看性能

October 14, 2012 · One minute read

在迁移Pebble的评论系统的时候,发现了个有趣的事儿。在用户提交评论,过了一般性的黑白名单检查以后,系统会返回一个页面给用户进行确认。让我感兴趣的是,这个页面没有包含任何和评论相关的内容,只有一个确认而已。细看代码才知道,用户提交的评论已经被存放在了session,当确认以后,评论会从session里面被取出,存到相对应的博客条目里。

这样的设计现在看来是值得商榷的。使用session存储临时对象对于可扩展性来说是一个灾难,姑且不说负载均衡中session复制的问题,如果短时间内被spam攻击,那么session里的临时评论很快就会把内存耗尽的,这个有些类似利用TCP三次握手的一个安全漏洞。在我上一个项目里,也有一个使用session来保存用户数据的设计,后来也是因为安全上的考虑,而改成了直接存储数据库。其实如果使用了粘性session,配合缓存系统来存储中间数据的话,这个设计还是可以接受的。

其次,两步骤的评论确认设计,在用户体验上也有些欠妥。毕竟Pebble的设计现在看起来是有些老了,目前看到的应该是capcha之类的校验比较多。除此之外,在评论提交的时候,原来的文章可能还会过期,或者状态变化,造成断链之类的问题,给设计带来了复杂性。

一个现代的设计,应该是尽量少用session的吧。