我目前参与了一个项目,将我们基于 dijkstra/a-star 算法的搜索算法转移到生产系统中。基本上,该算法接收请求并开始搜索,直到找到最佳解决方案,这通常需要几秒钟。问题是我们算法的原型版本依赖于 JDK优先级队列(基本上是一个二进制堆),它在搜索过程中会消耗大量内存。因此,如果我们想将算法放入生产系统中,同时处理多个请求,那么最大的问题之一就是如何处理系统的可扩展性。我们正在努力找出最好的选择,而我们脑海中浮现的想法是:
最简单的方法是在每次收到请求时创建一个新的算法实例,但这看起来并不是解决问题的有效方法(每个实例都需要大量的内存)。
当队列的大小太大时,使用某种持久且高效的存储/数据库将队列的部分元素移动到那里。这可以缓解内存问题,但会出现新问题,例如保持内存队列中的元素和存储中的元素之间的顺序。
将处理队列的任务委托给一个大框架,比如 Hazelcast。该算法的每个实例都可以使用带有 hazelcast 的分布式队列。问题是 Hazelcast 没有任何排序队列,所以我们必须从队列外部显式处理队列的顺序,这是一个很大的性能问题。
我们也在考虑使用 ActiveMQ 的想法,尽管该框架不是为此类问题而设计的。ActiveMQ 的优先级队列只管理 9 个不同的优先级,这对于我们的问题是不够的,因为我们根据浮点值(无限优先级)对队列中的元素进行排序。
我们完全迷失在这个架构设计问题中。欢迎任何建议。