问题背景

  1. 裁判文书采集系统,从中国裁判文书网上采集裁判文书,并生成.txt文件,每份裁判文书为一行;
  2. 裁判文书分析归档系统,需要从生成的.txt文件中读取裁判文书,并进行分析(采用特征工程的方式打标签)与入库(Elasticsearch);
  3. 裁判文书分析归档系统处理效率较低,每分钟只能处理500-600份裁判文书。

    代码执行过程

  4. 从文件中读取500条记录;

  5. 启用10个线程进行文书分析工作,分析完成后等待获取全部结果;
  6. 批量保存文书处理的结果到Elasticsearch中。

    问题排查

  7. 文件读取速度较快,暂时不考虑优化;

  8. 文书分析过程较为复杂,暂时不考虑优化;但是文书分析的速度较慢,虽然采用多线程的方式进行处理,但是仍然要等到全部处理完成后才保存,严重拖慢了整体效率;
  9. 批量保存文书处理的结果到Elasticsearch中也较为耗时。

    问题思路

  10. 由于文书分析结果要等到全部处理完成时,才批量保存Elasticsearch中,导致两种非常耗时的工作串行执行,即在文书处理期间,保存工作处于闲置状态;

  11. 考虑采用消息队列的方式提高速度,每个线程文书分析完成后,直接丢入消息队列,文书保存线程去消息队列中获取结果入库。

    问题解决

  12. 使用LinkedBlockingQueue作为队列,7个线程分析文书(生产者),3个线程保存文书分析结果(消费者);

  13. 经过优化每分钟可以处理1000-1100份裁判文书,提升较大。

    后续优化

  14. 优化消费者,采用每隔一段时间,批量保存的方式减轻Elasticsearch的压力;

  15. 精确计算文书分析耗时与保存耗时,确定最佳的生产者与消费者比例。