如何在Jboss集群中实现此Queue?

时间:2010-07-27 14:58:01

标签: java multithreading queue cluster-computing

我的应用程序作为中间件工作,接收来自客户端的请求,然后在某些逻辑中转换它,并将转换后的请求作为普通的HTTP请求或Webservice soap请求发送到另一个服务提供者。该应用程序部署在负载均衡器后面的两个jboss服务器(在集群中)。

假设我的应用程序是A,服务提供商是S.

现在我被告知,每年S会下降几(3-5)次。每次停机时间约为4小时。我可以得到关于停机时间的时间表。

在停机期间,A不应再转换并向S发送请求,而是将收到的请求放入队列中。 S返回后,应处理队列中的请求。

注意:

  1. 收到的请求A必须按照确切的顺序处理。一个接一个。处理请求意味着A将转换后的请求发送到S,并获得响应成功或错误。通常这不会花费太多时间。

  2. 基于1,当A处理排队的请求时,新的传入请求应该入队,尽管S已经可用。在队列为空之前,A可以继续直接向S发送请求。

  3. 每分钟A收到2-3个请求。

  4. 由于我们有两个Jboss,我计划在数据库中维护这个队列,线程处理队列并管理停机状态。然而,两个jboss之间的同步总让我头疼。

    很快,我遇到的问题是:

    • 如何设置停机时间标志,以便两个jboss执行请求enqeue,而不是发送。 (解决方案我认为,在处理每个请求之前,查询数据库是否有此标志。标志是由线程设置的。这可能是更糟糕的解决方案。)

    • S回来之后,如何设计两个jboss的Dequeue操作。 (似乎同时,总有一个jboss闲置......)

    • 如何通知两个jboss,“现在队列是空的,不要再排队了。”

    逻辑有点复杂。我希望我能清楚地解释我的问题......

    你们对此有什么想法吗?


    关于FIFO的更多描述。 如果没有停机时间,A可以并行处理来自不同客户端的请求。因为这个“交易喜欢”的订单是由客户确保的。例如。

    client x :
    -send http://..../createUser...
    -received 'success' from A
    -send http://../updateUser...
    -received 'success' from A
    

    如果createUser()失败,则不会发送updateUser。

    client y:
    -send http://.. createCompany...
    

    鉴于有另一个客户端(y)与x.createUser同时发送请求createCompany。这两个请求可以由A并行处理。

    一旦考虑停机时间和队列:

    -send http://..../createUser...
    (downtime)
    -received 'enqueue'
    (S is back)
    -send http://../updateUser...
    

    现在订单“create-> update”需要由A确保,而不是客户。


    提前致谢!

    肯特

1 个答案:

答案 0 :(得分:0)

您是否从S获得了正确收到特定请求的确认? (如果没有,你应该考虑实施这项让您的应用更稳健,并最大限度地减少损失,由于网络问题,服务器崩溃等请求的机会。)

这种确认机制可以通过使用增加超时的算法来增强,以防在发送请求之后没有及时接收到ACK。即如果在配置的超时间隔t内未收到ACK,则重新发送该请求。下次有更大的超时时间,例如2 * t,然后是4 * t等。只要未确认实际请求,就会对传入的新请求进行排队。成功传输实际请求后,将按FIFO顺序处理排队的请求。如果队列为空,则恢复正常处理。

该算法将自动处理S的计划停机时间以及任何其他网络故障等,代价是处理和网络流量稍微增加。但是每分钟有2-3个请求,这不应该是一个问题(当然,除非个别请求很大)。

当然,甚至可以改进它以使默认超时可以按时间段配置。即如果计划的停机时间为4小时,则默认超时可以设置为4小时。停机时间结束后,超时将重置为默认值。