"707":大佬是技术牛人啊,我有几个问题想请教下:
请问多久会同步一次论坛数据呢?
回复帖子还是跳转到原论坛吗?
是自己买的服务器还是公用的资源?
镜像站比原站快多了啊,简体字也够大,看起来很舒服,期待论坛管理员把网站迁到楼主的服务器上啊,到时给楼主点维护费帮忙运维就好
同步论坛数据的算法比较复杂。简单来说是直接用爬虫来抓网页,但是为了减少对源站服务器的压力,我尽量只做最低限度的抓取。策略大体来说是这样的:
1. 每两分钟抓取一次论坛首页,然后对比论坛首页上每个板块的最近发表时间,对于最近发表时间比镜像里要新的板块,将该板块标记为 dirty;
2. 抓取每个 ditry 板块的列表页,然后对比每个主题的最新更新时间,对于最近发表时间比镜像里要新的主题(或者是镜像里不存在的主题),将该主题标记为 dirty;如果列表页第一页的所有帖子的最近发表时间都比镜像里要新,那就再往后爬一页,直到遇到最新发表时间比镜像里要旧的帖子为止;(因此,避免了不必要的板块列表页抓取)
3. 对于每个 dirty 的帖子,抓取第一页(因为有时候第一页会被楼主编辑),然后直接跳到之前抓取过的最后一页,从那页开始往后爬,直到到达末页;(因此,避免了不必要的主题内容页抓取)
然后为了避免在高峰时段对源站服务器造成压力,会有一个全局的 throttle,一旦发现源站 503 等错误,直接暂停整个爬虫,过一会儿再重新开启;而如果开启后立刻又遇到 503 等错误,会再次暂停,并且这次暂停的时间会是第一次的 4 倍;以此类推,第 N 次连续遇到 503 等错误后,暂停的时间会是第 N-1 次连续遇到 503 等错误时的 4 倍。
考虑到论坛里发帖频率并不是非常高。因此,在非高峰时段,99% 以上的帖子应该能在发布后的两分半钟内被同步到镜像中;在高峰时段考虑到触发 throttle,应该能做到 95% 的帖子在五分钟内被同步到镜像中。
当然,实际上为了处理子板块、置顶帖、被删除帖、被移动至另一板块的帖子等 edge case,逻辑比这里说的要复杂很多,但是大体来说的逻辑是这样的。
因为镜像站是只可能读取源站的帖子,不可能对原论坛进行写入(除非用户愿意把源站的用户名和密码提供给镜像站),所以任何写入操作都只能指引用户跳转回源站操作。
服务器是 DigitalOcean 最便宜的一款 VPS 啦。