繁体   English   中英

如何在Jboss集群中实现此队列?

[英]How to implement this Queue in a Jboss cluster?

我的应用程序用作中间件,接收来自客户端的请求,然后以某种逻辑对其进行转换,并将转换后的请求作为常规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个请求。

由于我们有两个Jboss,因此我计划在数据库中维护该队列,在队列中工作的线程并管理停机时间状态。 但是,两个jboss之间的同步总是让我头疼。

不久,我遇到的问题是:

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

  • S返回后,如何设计两个jboss的出队操作。 (似乎同时有一个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...

现在,需要由A(而不是客户端)确保“创建->更新”的顺序。


提前致谢!

肯特

您是否从S收到确认已正确收到特定请求的任何确认? (如果没有,则应考虑实施此方法,以使您的应用程序更强大,并最大程度地减少由于网络问题,服务器崩溃等导致丢失请求的机会)

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

该算法将自动处理S的计划内停机时间以及任何其他网络故障等,其代价是更多的处理和网络流量。 但是,每分钟2-3个请求就不必担心了(当然,除非单个请求很大)。

当然,甚至可以对其进行改进,以使默认超时可以按时间段进行配置。 即,在计划的4个小时的停机时间内,可以将默认超时设置为4个小时。 停机时间结束后,超时将重置为默认值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM