有沒有誰碰到Weblogic應用伺服器叢集將客戶端的一個請求併發為兩個請求來同時進行處理?絕對實踐中的真實問題
本人現在公司用Java進行電子繳款系統模組的開發,
使用的是無狀態SessionBean,
應用伺服器為Weblogic配置的一個叢集,
偶爾出現過1-2次併發操作(併發程度在1秒以內);
簡單的說,我從前臺發起一個扣款請求,從程式流程和EJB的架構來說,後臺也應該發起一筆扣款請求;
問題就在於後臺不只發起一起扣款請求,而是幾乎同時發起兩筆扣款請求,從而導致併發重複扣款;
暫時還沒有找到具體產生原因,初步分析原因有兩個
1)伺服器叢集演算法出現Bug,導致同時有兩個Bean在伺服器中運作;
2)前臺的事件處理存在Bug,同時發起了兩個請求,只是介面上看不出來而已;
我的同事上次就這個問題發過問題,那是2個月前出現的一批併發重扣;
我今天再次發出此貼,就是因為前幾天我又發現了一批併發重扣;
我們再上一次的教訓上,這次多輸出了一些除錯資訊,主要是Weblogic的事務資訊如下:
連續兩個我認為併發的Bean輸出的日誌如下(但是我不清楚這些日誌代表什麼意思):
2004-12-14 11:29:50,402 [system:124] [ExecuteThread: '8' for queue: 'weblogic.kernel.Default'] - ZScomm ZSetskkService.logTx jklsh = 3200412052036014
**********
txid1 = BEA1-72E10BBC0AA811840C29
**********
txid2 = BEA1-72E10BBC0AA811840C29
**********
TxStatus1 = Active
**********
TxStatus2 = Active
**********
timeSinceBegin1 = 645
**********
timeSinceBegin2 = 645
**********
tx1 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E10BBC0AA811840C29(17975654),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=599,activeThread=Thread[ExecuteThread: '8' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@190cb2a),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
**********
tx2 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E10BBC0AA811840C29(17975654),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=599,activeThread=Thread[ExecuteThread: '8' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@190cb2a),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
========================================================================================
2004-12-14 11:29:50,993 [system:124] [ExecuteThread: '20' for queue: 'weblogic.kernel.Default'] - ZScomm ZSetskkService.logTx jklsh = 3200412052036016
**********
txid1 = BEA1-72E50BBC0AA811840C29
**********
txid2 = BEA1-72E50BBC0AA811840C29
**********
TxStatus1 = Active
**********
TxStatus2 = Active
**********
timeSinceBegin1 = 763
**********
timeSinceBegin2 = 763
**********
tx1 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E50BBC0AA811840C29(18172396),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=600,activeThread=Thread[ExecuteThread: '20' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@a82896),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
**********
tx2 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E50BBC0AA811840C29(18172396),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=600,activeThread=Thread[ExecuteThread: '20' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@a82896),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
=======================
=======輸出以上日誌資訊所用到的方法如下=================
weblogic.transaction.Transaction t1 = weblogic.transaction.TxHelper.
getTransaction();
String txid1 = "" + t1.getXid();
String txStatus1 = "" + t1.getStatusAsString();
long timeSinceBegin1 = t1.getMillisSinceBegin();
weblogic.transaction.Transaction t2 = ((weblogic.transaction.
Transaction) weblogic.transaction.TransactionHelper.
getTransactionHelper().getTransaction());
String txid2 = "" + t2.getXid();
String txStatus2 = "" + t2.getStatusAsString();
long timeSinceBegin2 = t2.getMillisSinceBegin();
LogWritter.sysError("ZScomm ZSetskkService.logTx jklsh = " + jklsh +
" \r\n**********\r\n txid1 = " + txid1 +
" \r\n**********\r\n txid2 = " + txid2 +
" \r\n**********\r\n TxStatus1 = " + txStatus1 +
" \r\n**********\r\n TxStatus2 = " + txStatus2 +
" \r\n**********\r\n timeSinceBegin1 = " +
timeSinceBegin1 +
" \r\n**********\r\n timeSinceBegin2 = " +
timeSinceBegin2 +
" \r\n**********\r\n tx1 = " + t1.toString() +
" \r\n**********\r\n tx2 = " + t2.toString());
使用的是無狀態SessionBean,
應用伺服器為Weblogic配置的一個叢集,
偶爾出現過1-2次併發操作(併發程度在1秒以內);
簡單的說,我從前臺發起一個扣款請求,從程式流程和EJB的架構來說,後臺也應該發起一筆扣款請求;
問題就在於後臺不只發起一起扣款請求,而是幾乎同時發起兩筆扣款請求,從而導致併發重複扣款;
暫時還沒有找到具體產生原因,初步分析原因有兩個
1)伺服器叢集演算法出現Bug,導致同時有兩個Bean在伺服器中運作;
2)前臺的事件處理存在Bug,同時發起了兩個請求,只是介面上看不出來而已;
我的同事上次就這個問題發過問題,那是2個月前出現的一批併發重扣;
我今天再次發出此貼,就是因為前幾天我又發現了一批併發重扣;
我們再上一次的教訓上,這次多輸出了一些除錯資訊,主要是Weblogic的事務資訊如下:
連續兩個我認為併發的Bean輸出的日誌如下(但是我不清楚這些日誌代表什麼意思):
2004-12-14 11:29:50,402 [system:124] [ExecuteThread: '8' for queue: 'weblogic.kernel.Default'] - ZScomm ZSetskkService.logTx jklsh = 3200412052036014
**********
txid1 = BEA1-72E10BBC0AA811840C29
**********
txid2 = BEA1-72E10BBC0AA811840C29
**********
TxStatus1 = Active
**********
TxStatus2 = Active
**********
timeSinceBegin1 = 645
**********
timeSinceBegin2 = 645
**********
tx1 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E10BBC0AA811840C29(17975654),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=599,activeThread=Thread[ExecuteThread: '8' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@190cb2a),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
**********
tx2 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E10BBC0AA811840C29(17975654),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=599,activeThread=Thread[ExecuteThread: '8' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@190cb2a),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
========================================================================================
2004-12-14 11:29:50,993 [system:124] [ExecuteThread: '20' for queue: 'weblogic.kernel.Default'] - ZScomm ZSetskkService.logTx jklsh = 3200412052036016
**********
txid1 = BEA1-72E50BBC0AA811840C29
**********
txid2 = BEA1-72E50BBC0AA811840C29
**********
TxStatus1 = Active
**********
TxStatus2 = Active
**********
timeSinceBegin1 = 763
**********
timeSinceBegin2 = 763
**********
tx1 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E50BBC0AA811840C29(18172396),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=600,activeThread=Thread[ExecuteThread: '20' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@a82896),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
**********
tx2 = Name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)],Xid=BEA1-72E50BBC0AA811840C29(18172396),Status=Active,numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=600,activeThread=Thread[ExecuteThread: '20' for queue: 'weblogic.kernel.Default',5,Thread Group for Queue: 'weblogic.kernel.Default'],XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=ended,assigned=none),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@a82896),SCInfo[coredomain+coreapp4]=(state=active),SCInfo[eaidomain+eaiserver]=(state=active),properties=({weblogic.transaction.name=[EJB gov.gdlt.taxcore.gateway.facade.TaxFacadeGateWayBean.invokeTask(gov.gdlt.taxcore.comm.event.RequestEvent)], weblogic.jdbc=t3://150.18.30.31:7013}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+, XAResources={},NonXAResources={})],CoordinatorURL=coreapp4+150.18.30.31:7013+coredomain+t3+)
=======================
=======輸出以上日誌資訊所用到的方法如下=================
weblogic.transaction.Transaction t1 = weblogic.transaction.TxHelper.
getTransaction();
String txid1 = "" + t1.getXid();
String txStatus1 = "" + t1.getStatusAsString();
long timeSinceBegin1 = t1.getMillisSinceBegin();
weblogic.transaction.Transaction t2 = ((weblogic.transaction.
Transaction) weblogic.transaction.TransactionHelper.
getTransactionHelper().getTransaction());
String txid2 = "" + t2.getXid();
String txStatus2 = "" + t2.getStatusAsString();
long timeSinceBegin2 = t2.getMillisSinceBegin();
LogWritter.sysError("ZScomm ZSetskkService.logTx jklsh = " + jklsh +
" \r\n**********\r\n txid1 = " + txid1 +
" \r\n**********\r\n txid2 = " + txid2 +
" \r\n**********\r\n TxStatus1 = " + txStatus1 +
" \r\n**********\r\n TxStatus2 = " + txStatus2 +
" \r\n**********\r\n timeSinceBegin1 = " +
timeSinceBegin1 +
" \r\n**********\r\n timeSinceBegin2 = " +
timeSinceBegin2 +
" \r\n**********\r\n tx1 = " + t1.toString() +
" \r\n**********\r\n tx2 = " + t2.toString());
相關文章
- 有沒有誰碰到Weblogic應用伺服器叢集將客戶端的一個請求併發為兩個請求來同時進行處理?絕對實踐中的真實問題-----望各位高手指點一二Web伺服器客戶端
- 一個線上問題的思考:Eureka註冊中心叢集如何實現客戶端請求負載及故障轉移?客戶端負載
- nginx 處理客戶端請求的完整過程Nginx客戶端
- 關於在request請求時,處理請求引數的問題
- Java後端中的請求最佳化:從請求合併到非同步處理的實現策略Java後端非同步
- 對tomcat來說,每一個進來的請求(request)都需要一個執行緒,直到該請求結束。Tomcat執行緒
- nginx 如何處理一個請求Nginx
- 短影片原始碼,實現預處理防止客戶端頻繁請求原始碼客戶端
- 422是一個HTTP狀態碼,表示伺服器理解客戶端的請求,但無法處理該請求。這個狀態碼通常被用於Web應用程式中的表單驗證,其中伺服器無法處理客戶端提交的表單資料。HTTP伺服器客戶端Web
- jQuery:在一個回撥中處理多個請求jQuery
- 大請求、請求超時問題
- 合併HTTP請求vs並行HTTP請求,到底誰更快?HTTP並行
- 合併HTTP請求 vs 並行HTTP請求,到底誰更快?HTTP並行
- nginx截獲客戶端請求Nginx客戶端
- 併發請求的重複插入問題
- 一個請求在Struts2框架中的處理流程框架
- Spring MVC 處理一個請求的流程分析SpringMVC
- 提交一個併發請求(Concurrent Program)
- Git如何合併一個已經在GitHub上提交但沒有合併的Pull Request請求Github
- SpringBoot可以同時處理多少請求?Spring Boot
- 不到50行程式碼實現一個能對請求併發數做限制的通用RequestDecorator行程
- 求問一個 swipe 的問題,請大神們指教
- Tomcat如何使用執行緒池處理遠端併發請求Tomcat執行緒
- 關於兩次http請求,後一次請求影響前一次請求的問題HTTP
- options 請求跨域問題處理跨域
- 請求OpenFeign的GET請求時,請求為何失敗?
- 兩個非常棘手的問題,有socket方面經驗的請進
- TodoKit客戶端/服務端原始碼都放出來了,有興趣的可以看看,請求指教客戶端服務端原始碼
- 請教個mysql叢集的問題MySql
- [疑問] [已解決] updateOrCreate () 這類方法應對併發請求的問題
- Android客戶端請求伺服器端的詳細解釋Android客戶端伺服器
- 如何中斷一個正在發出的請求
- Nginx基於客戶端請求頭的訪問分類Nginx客戶端
- 網站提示400 - 請求錯誤,伺服器無法理解客戶端的請求怎麼辦網站伺服器客戶端
- Java中實現並行請求兩種方式Java並行
- jmeter 如何將上一個請求的結果作為下一個請求的引數——使用正則提取器JMeter
- 為了一個HTTP請求問題,差點和iOS幹起來HTTPiOS
- android客戶端向伺服器傳送請求中文亂碼的問Android客戶端伺服器