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

标签 java database architecture scalability bigdata

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

但为了可扩展性;数据收集将由与各个数据库连接的多台机器(perf monitor)收集。

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

所以问题是:

1) How will i make the mutiple monitor datas to be sorted based on the client request at Mgr. Each monitor may give the result as per the client request; but still how to merge multiple machines datas through java? Means How to perform in memory sql aggregate/scalar (e.g. Groupby, orderby, avg) function on all the results retrieved from multiple clusters at MGR. How do i implement DB sql aggregate/scalar functionality in java side, any known APIs? I think what i need is Reduce part of mapreduce technique in hadoop.

2) A request from UI (assume select count(*) from DB where Memory > 1000MB) have to be forwarded to multiple machines. Now how to send parallel requests to individual monitor and consume only when all the nodes are responded? Means how to wait User thread till consuming all the responses from perf monitors? How to trigger parallel REST request for single UI request on MGR.

3) Do I have to authenticate UI user at both Mgr and Perf monitor?

4) Are you thinking any drawback in this approach?

注意事项:

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

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

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

enter image description here

最佳答案

您想扩展您的应用,但您设计了一个固有的瓶颈。即:经理。

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

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

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

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

关于认证的注意事项:你应该在前端对HTTP请求进行认证,然后你就可以了。只需将唯一 ID(很可能是 session ID)分配给连接到您的管理器的用户,并在您将请求进一步转发到下游服务器时使用此内部 ID。

Now how to send parallel requests to individual monitor and consume only when all the nodes are responded? Means how to wait User thread till consuming all the responses from perf monitors? How to trigger parallel REST request for single UI request on MGR.

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

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

关于java - 如何处理一个请求来自不同服务器的多个数据库结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38115694/

相关文章:

architecture - DDD - 域或应用程序层中的存储库接口(interface)?

sql - 向非程序员解释为什么 "Just add another column to the DB"是个坏主意

java - 使用 Log4j 捕获异常

java - 订阅后合并PublishSubject

java - 奇怪的 EJB 行为还是我错过了什么???

database - 如何在 arangodb 中重置 root 密码?

java - 使用 Maven 发布的 Java 项目的 TFS 项目结构

sql - 使用 case 语句检查 SQL 表中是否存在记录

database - 将函数依赖转化为第三范式

c++ - 关于如何使用 Qt 模型 View 类的建议