关于这个用例的架构/设计的一些问题?

时间:2014-04-03 16:48:53

标签: java architecture jms

我的应用程序需要作为中间件工作,它从各种方式获得订单(以xml的形式) 包含供应商ID的客户。一旦收到订单,就需要发送订单请求 以xml.i的形式向不同的供应商提供关于它的三个方面的双重思想。他们在这里: -

问题:

  1. 我在高级别的计划是在请求到来时,将它放在jms队列中。(现在我不确定 我应该为每个供应商创建队列,还是一个队列就足够了。我认为一个队列就足够了。 因为维护大量队列将是开销。)为每个供应商维护单独的队列的优点是可以更快地处理消息,因为每个队列上都有单独的生产者。

  2. 将对象放入队列之前 我需要做一些业务验证。另外输入xml的结构我接收和输出xml我需要发送给供应商是不同的。为此,我计划将输入xml转换为java对象,然后放入队列 这样可以在消费者方面轻松完成验证。另一个想法是不要将xml转换为java对象,只需获取所有元素 值通过xpath / xstream api并验证它们并将xml字符串放在队列中因为。然后在消费者端将xml转换为java对象,然后转换为不同的xml格式。有办法吗?

  3. 现在我的要求是队列消费者每隔5小时处理队列中的消息并发送xml请求 给供应商。我打算在这里使用石英调度程序,它将逐个选择作业并发送给相应的 供应商基于supplierId。这是我的问题是,如果我的工作逐一选择消息,然后将其发送给供应商。 它太慢了。我打算在石英作业创建ThreadPool的时候处理它,其中大小为十个线程 它同时处理来自队列的消息(所以这里将是队列中的多个消费者。我认为这对队列无效。我是否需要这里的主题而不是队列?)。第二种方法是更好还是有更好的方法?

  4. 我期待每小时加载50k请求,这意味着每秒约15个请求

2 个答案:

答案 0 :(得分:1)

您的基本要求是,

  1. 以XML格式获取客户订单(您尚未告知如何接收)
  2. 进行基本业务验证。
  3. 将订单发送给供应商
  4. 您将获得50k请求(您还没有提供大致的订单大小)。 假设您的平均订单大小为10K,那么只需将其保存在队列中就可以达到500 MB左右(无论队列数量如何)。我不确定你在哪个环境中运行。

    对于第1点           我会选择单个队列而不是多个队列               - 选择适当的持久性存储。 我假设您将使用分布式队列,以便在添加群集时可以轻松扩展。

    对于第2点           我将转换为POJO(您自己的格式)并执行业务验证。因此,如果您希望将业务验证扩展到标尺或任何其他转换,则很容易维护。            - 基本上以任何形式获得输入(XML / POJO / JSON ...)并转换为中间格式(您可以在中间fomart之上编写客户验证器/转换实用程序)。并且保持Mappings在Common格式之间输入和输出。这样您就可以编写格式化程序并使用它们。在改变任何特定供应商的格式时,将来不会产生影响。尝试外部化格式映射。

    对于第3点         在您的情况下,订单只需要处理一次。所以我会选择Queue。并且您可以拥有多个Message Listener。消息侦听器以异步方式传递顺序。因此,您可以为队列提供多个侦听器。每个听众都会运行单独的线程。 收到订单后立即发送问题是否有问题?对您和供应商来说,在特定时间避免重载会对您有好处。

答案 1 :(得分:0)

由于您是中间件,因此您应该在联系点快速处理数据,以便获得更多传入请求。因此,您必须找到一种方法来区分传入数据尽可能快速和低内存。将数据处理留给更具体问题的模块。接待员只是在正确的位置指导客人。

如果您以后必须阅读并理解专业工作人员收到的数据,请使用线程池。通过这种方式,您可以并行处理数据,而无需过多担心outofmem。只需巧妙地选择您的游泳池大小,只使用一个。您可以使用侦听器模式向工作多通道发送新的传入数据。如果可能的话,您应该避免使用jaxb或更好的数据完全反序列化。它像地狱一样吃掉记忆。

我不会使用jmx,因为你的“消息”只与一个听众有关。

如果可以在工人完成工作后立即发送邮件。如果没有,请使用存储空间。通过这种方式,您可以稍后验证处理数据,如果出现问题或者您必须更新软件,则无需担心易失性数据。