相对于Scrapy框架,增加了Kafka和Redis模块的Scrapy Cluster要复杂的多。因此要搞清楚各大模块之间是如何工作的,就至关重要了。在Scrapy Cluster框架中,有三大系统模块:Kafka,Redis,Scrapy Spider。其中Kafka和Redis之间的消息传递是通过kafka_monitor.py组建实现的(单向连接)。Scrapy Spider和Redis的连接是通过distributed_scheduler.py实现的(双向连接)。Scrapy Spider与Kafka之间的连接是通过pipelines.py里面的KafkaPipeline类实现的(单向连接)。
我们可以把由Kafka,Redis和Scrapy Spider组成的系统看作一个封闭系统,所有数据输入和输出,都是通过Kafka实现的。我们可以通过向Kafka中特定的Topic发送消息使整个系统运转起来,也可以通过向Kafka发送消息,获取系统内部的状态(虽然可以把外部系统连接到Redis服务器,但是不建议这么做,主要是会提高系统的复杂性)。为了能够梳理清楚整个系统的消息流,本文将先讲解以下Kafka和Redis之间的消息生产和消费。
如上图描述,Kafka和Redis之间是通过kafka_monitor.py文件来实现消息的消费和传递的。kafka_monitor.py是一个常驻内存的程序,每隔一段时间就会连接kafka去消费数据。以下是其中一段代码(开源项目,可以访问Github代码库):
def _main_loop(self):
'''
Continuous loop that reads from a kafka topic and tries to validate
incoming messages
'''
self.logger.debug("Processing messages")
old_time = 0
while True:
self._process_messages()
if self.settings['STATS_DUMP'] != 0:
new_time = int(old_div(time.time(), self.settings['STATS_DUMP']))
# only log every X seconds
if new_time != old_time:
self._dump_stats()
old_time = new_tim