【发布时间】:2012-07-02 20:31:32
【问题描述】:
我的应用程序作为中间件工作,接收来自客户端的请求,然后将其转换为特定逻辑,并将转换后的请求作为普通 HTTP 请求或 Webservice soap 请求发送到另一个服务提供者。该应用程序部署在负载平衡器后面的两台 jboss 服务器(集群中)上。
假设我的应用程序是 A,服务提供者是 S。
现在我得知,每年 S 都会下降几 (3-5) 次。每次停机时间将持续约 4 小时。我可以得到一个关于停机时间的时间表。
在停机期间,A 不应再转换并向 S 发送请求,而是将接收到的请求放入队列中。 S回来后,应该处理队列中的请求。
注意:
收到的请求 A 必须按照它们来时的确切顺序进行处理。一个接一个。处理请求是指 A 向 S 发送转换后的请求,并获得响应成功或错误。通常这不会花费太多时间。
基于 1,当 A 处理排队的请求时,尽管 S 已经可用,但应将新的传入请求排入队列。直到队列为空,A 可以继续直接向 S 发送请求。
A 每分钟收到 2-3 个请求。
由于我们有两个 Jboss,我计划在数据库中维护这个队列,线程在队列上工作并管理停机状态。但是,两个jboss之间的同步总是让我头疼。
很快,我遇到的问题是:
如何设置停机时间标志,让两个jboss做请求入队,而不是发送。 (我认为的解决方案是,在处理每个请求之前,为此标志查询数据库。该标志是由线程设置的。这可能是更糟糕的解决方案。)
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...
现在“创建->更新”的顺序需要由 A 来确保,而不是客户端。
提前致谢!
肯特
【问题讨论】:
标签: java multithreading queue cluster-computing