在数十万行上使用Excel

今年,我们已经在Habré上撰写了有关我们项目SmartCalls.io的信息 -该项目是为企业用户创建的可视化呼叫设计器。 该项目解决了大批量客户呼叫的业务问题:创建可视呼叫脚本,加载带有电话号码的Excel文件,然后创建呼叫活动。 活动启动-呼吁客户开始; 您可以随时查看统计信息,暂停广告系列,调整设置。 客户感到满意,直到变得明显,有时有必要不仅召集很多人,而且召集非常非常多的人。 问题的实质是如何解决问题,以及我们如何使用HYIP(并非不合理地)编程语言来解决问题。


问题


最初,文件处理是在PHP 7.1中实现的-这是一个显而易见的选择,因为整个SmartCalls API都写在上面。 使用呼叫列表有一个限制-文件中最多只能包含1万行填充行。 此限制是从SmartCalls的一开始就开始的,但是并不重要。 直到某一点。

一家大型银行需要开展大型的电话宣传活动:需要吸引超过1万名用户。 当然,没有什么可以阻止将大文件分成几个小文件并一次下载一个,但是让客户遭受痛苦不是我们的方法。 说到备用下载-如果我们的客户已经启动了一个致电广告系列,并且突然想要将用户添加到其中,那么他可以轻松地做到这一点。 这非常方便,因为您无需停止呼叫或为新用户运行单独的广告系列。 但是,您应该了解,重新加载的可能性并不是一种手动加载较大文件的方法。

因此,该团队的任务是-在广告系列中实施上传大型文件以便打电话。

解决方案


我们在Java开发方面非常有能力-例如,部分Voximplant API是用这种语言实现的; 我们也擅长PHP(请参见上面的示例-Captain Evidence建议)。 也就是说,我们可以使用其中一种语言快速完成此任务,但是我们考虑了很长时间来扩展技术堆栈,并且在这里我们很想起Go:它足够快(与内存配合很好),多线程并且不需要运行时因为 Go编译成可执行的二进制文件。 此外,我们可以说说容器的大小,但是稍后再说...

结果,我们用Go语言编写了一个微服务,该服务接受大尺寸(经测试最多30万行)和格式(xls,xlsx及其所有变体)的工作表。 现在是时候了。

实作


当客户向SmartCalls广告活动上载超过1万行的文件时,将为其使用微服务。 它需要输入指针:

  • 下载到S3存储器的文件;
  • 需要将此文件上传到的广告系列。

然后,微服务会遍历该文件,以1万行的块(平台最大数量)对其进行命中,并将每个块作为csv文件加载到S3存储中,在数据库中记录每个块的信息(文件路径,行数)。 每个块均被处理并加载到单独的流中,这进一步提高了执行速度。

为了读取Excel文件,使用了tealegextrame的开源库。 很好,他们不仅有很多明星,而且还有新鲜的承诺:)

import ( "github.com/tealeg/xlsx" "github.com/extrame/xls" //   ) 

一切都会好起来的,但并非没有细微差别。 在开发过程中,事实证明,在不同的编辑器中创建的xlsx和xls在使用它们的格式和规则上有很大的不同。 我不得不做很多测试-OpenOffice,不同版本的Excel,LibreOffice,Google Sheets,以教微服务将文件转换为单一格式-CSV。 在微服务“咀嚼”一个大文件并将其转换为CSV后,SmartCalls API将打开并已与此csv文件一起使用。 对于微服务,我们保留了30万行的限制,因为它极大地满足了客户的需求,而我们根本没有遇到任何更大的需求。

结果,该实现在测试和预生成产品中显示了出色的结果,之后我们将其推广到了产品中。

结论


我们的团队一直在努力快速推出新功能/改进,因为我们希望满意的客户保持这种状态。 大文件的任务不仅是我们面临的另一个挑战,也是将Go引入项目的一个很好的理由,我们已经研究了很长时间。 除了快速发展和提高工作速度外,当我们开始引入容器(这种容器非常轻巧)时,Go为我们的未来奠定了基础。 我们将分别介绍容器,敬请期待:)

Source: https://habr.com/ru/post/zh-CN424697/


All Articles