如何处理来自不同服务器的多个数据库结果的请求

我有云统计(结构化数据::CSV)信息;我必须向管理员和用户公开。

但是为了可扩展性;数据收集将由与各个DB连接的多台机器(性能监视器)收集。

现在管理器(Mgr)负责将请求多播到所有perf监视器;以收集整体统计信息数据以满足单个 UI 请求。

所以问题是:

1)我如何根据Mgr的客户端请求对多个监视器数据进行排序,每个监视器都可以根据客户端请求给出结果;但仍然如何通过java合并多台机器数据?表示如何在内存中执行 sql 聚合/标量(例如 Groupby、orderby、avg)函数,这些函数在 MGR 上从多个集群检索到的所有结果。如何在Java端实现DB sql聚合/标量功能,任何已知的API?我认为我需要的是减少hadoop中mapreduce技术的一部分。

2) 来自 UI 的请求(假设从数据库选择 count(*),其中内存> 1000MB)必须转发到多台计算机。现在,如何将并行请求发送到单个监视器,并且仅在所有节点都响应时才使用?意味着如何等待用户线程直到消耗来自perf监视器的所有响应?如何在 MGR 上为单个 UI 请求触发并行 REST 请求。

3) 我是否必须在 Mgr 和 Perf 监视器上对 UI 用户进行身份验证?

4)你认为这种方法有什么缺点吗?

笔记:

1)我没有选择NoSql,因为数据是结构化的,不需要连接。

2)我没有选择node.js因为我是新手,可能需要更多时间来开发它。另外,我没有开发任何单线程最适合的并发关键。这里只完成数据的推送/检索。无修改发生。

3) 我希望每个监视器都有单独的数据库,或者一个实例至少有两个具有多个集群的数据库实例,以支持更快地访问实时大统计数据。

enter image description here


答案 1

你想要扩展你的应用,但你设计了一个固有的瓶颈。即:主教。

我要做的是,我将Mgr分成至少两部分。前端和后端。前端可以简单地是一个聚合器和/或控制器,它收集来自所有不同UI服务器的所有请求,为这些请求添加时间戳并将其放入队列(RabbitMQ,Kafka,Redis等)中,使用UI会话ID或类似的东西来唯一标识请求的来源。然后,您只需要等到在队列上收到响应(当然具有不同的主题)。

然后在后端(队列的另一端),您可以设置负载所需的任意数量的节点,并使它们执行相同的任务。即:从队列中提取请求,并根据需要调用这些性能监控 API。您可以根据需要扩展这些后端节点,因为它们没有任何状态,所有需要存储的状态都已经是队列中消息的一部分,这些消息将由Redis / Kafka / RabbitMQ或您选择的任何其他内容自动为您保留。

您也可以使用Apache Storm或类似的东西在后端为您执行此操作,因为它正是为此类应用程序而设计的。

Apache Storm还具有通过Trident API公开的内置合并功能。

关于身份验证的注意事项:您应该在前端对HTTP请求进行身份验证,然后您将没事。只需将唯一 ID(最有可能是会话 ID)分配给连接到 mgr 的用户,并在将请求进一步转发到下游服务器时使用此内部 ID。

现在,如何将并行请求发送到单个监视器,并且仅在所有节点都响应时才使用?意味着如何等待用户线程直到消耗来自perf监视器的所有响应?如何在 MGR 上为单个 UI 请求触发并行 REST 请求。

好吧,如果你对处理用户连接和为这些客户端提供响应有很多问题,那么我建议你拿起一本关于Java servlets API的书。例如,您可能想阅读以下内容:Servlet & JSP: A Tutorial (A Tutorial series)。。它有点过时了,但写得很好。

但是,恕我直言,如果您对这些非常基本的主题有如此多的问题,那么最好将架构设计留给更有经验的人。


答案 2

不要重新发明轮子,使用一些很好的现有BAM和数据库监控工具,它们有很多内置的仪表板和统计信息,易于与Java和工作流连接。


推荐