不可能完成的任务

文摘   科技   2023-08-14 15:22   日本  

夏日是一个热力四射和充满活力的季节。各种海边音乐节、野外烧烤大会、河边花火表演,闹市里的美食夜市,每一个瞬间都伴随着现金、二维码、信用卡、储值卡等各种不同的支付方式。在这些大量人群聚集的交易场景下,高并发的支付请求往往如潮水般涌入各个支付公司,严重考验着支付公司应对短暂高峰的能力。

星辰大海支付公司通过支付通道连接小岛信用卡公司,完成与信用卡相关的支付请求处理。但是,小岛信用卡公司因为本身支付通道入口资源的限制,只能提供给星辰大海支付公司每秒钟同时处理2笔交易(2TPS)的支付通道。这就像把一条大河的水流导入一根细小的管道,对星辰大海支付公司的产品技术来说,这是一项不可能完成的任务。那么应该怎么做才能完成这项不可能完成的任务呢?

异步处理是这种情况下的首选。如果说打电话是同步的话,微信聊天就是异步。打电话需要在一方说完话之后,另外一方立即回答。微信聊天可以是一方发出消息,另一方根据重要性和紧急程度(优先级),隔几分钟甚至更久才做出响应。由此也能看到,打电话基本上只能是同一个时间处理一件事,而发微信可以一次与N个人同时进行对话处理N件事,两者在并发性、吞吐量和处理能力上高下可见。

异步模式是一种计算和设计模式,其中操作的执行不会立即返回结果,而是在操作启动后的某个时间点完成。异步的关键思想是允许系统在等待某个长时间操作完成时继续进行其他任务,从而提高系统的整体效率和响应性。异步模式涉及到在不等待完成的情况下启动操作,并在稍后的时间点获取结果。这通常可以通过回调、事件、承诺(promises)、未来(futures)、可观察(observables)等机制来实现。诸如文件读写、网络请求等I/O操作是异步编程的经典应用,因为这些操作通常需要比CPU操作耗费更长的时间。UI和图形编程也经常使用异步模式,以确保用户界面始终保持响应状态,而不会被长时间操作所阻塞。具体的异步处理模式包括 NIO、消息队列、事件驱动等很多种,如下表所示:

在异步处理模式的众多选择中,NIO最常见。在高并发场景中,NIO的设计模式不可小觑。它使用Selector监控多个Channel,以事件驱动的方式通知我们,哪些Channel已经准备好可以进行I/O操作。这使得单一线程可以管理成千上万的连接。最为适用的应用场景是Web前端应用。

面对这个不可能完成的任务,星辰大海支付公司的研发工程师们思绪万千。他们的决策再一次证明了马斯洛锤子理论的英明。因为当工程师们看到了2TPS并发这个钉子的时候,他们首先就想到了自己手里常用的NIO锤子,于是在通过2TPS支付通道向小岛信用卡公司提交支付指令的应用设计上采用了NIO。虽然NIO解决了快速接受请求的问题,但却无法解决与小岛信用卡公司联结的2TPS瓶颈问题。尽管在星辰大海公司向小岛信用卡公司提交支付指令后,应用可以释放处理线程不再理睬,从而有效地避免线程堆积所带来的系统资源消耗问题。但是,这个解决方案无法保障所有的支付指令都能真正地传递到小岛信用卡公司,并得到成功的处理结果。如果前端的支付请求量很大,尽管后端应用毫发未损,但是支付请求会出现大量失败的情况。
那么到底应该怎么进行异步设计,才能应对这个不可能完成的任务呢?基于消息队列的异步处理是最佳答案。因为消息队列可以有足够的缓冲空间存储所有前端过来的支付请求,并且根据星辰大海公司与小岛信用卡的通道繁忙情况,合适地调配支付指令的提交速度,从而保障支付请求的最后实现,属于负责任的解决方案。具体地说,就是在前端收到支付请求后,通过消息队列的生产者,把要处理的支付请求送到消息队列上,然后由消息队列的消费者,根据下游通道的繁忙程度,从消息队列中取出消息进行处理。
消息队列是一种典型的异步处理方式。生产者产生交易请求,消费者处理交易。而消息队列就像一个中介,确保消费者不会被过多的请求淹没。消息队列可以保证即使在系统崩溃的情况下,交易信息也不会丢失,因此有很好的持久性与可靠性。以下对常见的消费队列,适用的语言及其特性进行了总结:
实际上,NIO能够处理高并发,提高系统的响应速度,特别适合前端请求处理。消息队列可以确保后端处理的稳定性和可靠性,特别适合与第三方系统的交互,如小岛信用卡公司。如果双剑合璧,在前面处理来自于互联网的支付请求的时候,采用NIO的处理模式;同时,在处理与小岛信用卡公司的交互的后端应用时,采用消息队列的方式,那么就可以更好地解决这个不可能完成的任务。
技术的选择和应用都是为了解决实际问题。在星辰大海支付公司面对的这个“不可能完成的任务”中,如果能够深刻理解异步模式的技术本质,正确地掌握并应用NIO和消息队列的特性,并且扬长避短,就可以为用户创造无与伦比的体验,即使在炎热繁忙的夏日也是如此。

-----------------------------------

想要了解更多关于支付的故事,请阅读《一本书读懂支付》---扫描下方↓二维码,即可获得!

-----------------------------------

作者介绍




陈 斌
NETSTARS
首席技术官(CTO)



架构决定未来
Netstars技术分享
 最新文章