2017-05-05 22 views
1

我目前正在研究以下問題,發生在我們的項目在高負載下:點對點類加載在Apache Ignite中如何工作?

class org.apache.ignite.IgniteDeploymentException: Failed to deploy user message: java.nio.HeapByteBuffer[pos=0 lim=180 cap=180] 
at org.apache.ignite.internal.util.IgniteUtils$8.apply(IgniteUtils.java:825) 
at org.apache.ignite.internal.util.IgniteUtils$8.apply(IgniteUtils.java:823) 
at org.apache.ignite.internal.util.IgniteUtils.convertException(IgniteUtils.java:944) 
at org.apache.ignite.internal.IgniteMessagingImpl.send0(IgniteMessagingImpl.java:106) 
at org.apache.ignite.internal.IgniteMessagingImpl.send(IgniteMessagingImpl.java:82) 
... 

Caused by: class org.apache.ignite.internal.IgniteDeploymentCheckedException: Failed to deploy user message: java.nio.HeapByteBuffer[pos=0 lim=180 cap=180] 
at org.apache.ignite.internal.managers.communication.GridIoManager.sendUserMessage(GridIoManager.java:1571) 
at org.apache.ignite.internal.IgniteMessagingImpl.send0(IgniteMessagingImpl.java:103) 
... 25 more 

總之,情況如下:

    在三個節點,所有節點
  • 分佈式緩存在單個工作站上運行(在此測試中);
  • 每個節點上的工人;
  • 使用IgniteMessaging完成工作人員之間的消息傳遞(主題具有String類型,並且我嘗試了byte []和ByteBuffer作爲消息類);
  • 客戶端連接到羣集並觸發一些業務邏輯,導致跨節點消息傳遞和掃描查詢。查詢和消息正在同時執行。

我們在連續部署模式下使用對等分類加載(問題與共享模式相同)。根據Ignite文檔,僅當版本發生更改時才應該重新部署這些類,但似乎不起作用。

我注意到很多類似的消息在日誌:

2017-05-05 13:31:28 INFO org.apache.ignite.logger.java.JavaLogger info Removed undeployed class: GridDeployment [ts=1493980288578, depMode=CONTINUOUS, [email protected], clsLdrId=36c3828db51-0d65e7d5-77bf-444d-9b8b-d18bde94ad13, userVer=0, loc=true, sampleClsName=java.lang.String, pendingUndeploy=false, undeployed=true, usage=0] 
... 
2017-05-05 13:31:29 INFO org.apache.ignite.logger.java.JavaLogger info Removed undeployed class: GridDeployment [ts=1493980289125, depMode=CONTINUOUS, [email protected], clsLdrId=1dd3828db51-1b20df7a-a98d-45a3-8ab6-e5d229945830, userVer=0, loc=true, sampleClsName=java.lang.String, pendingUndeploy=false, undeployed=true, usage=0] 
... 

這是當我使用的ByteBuffer作爲消息類型。在字節[]的情況下,B類[正在不斷重新部署。

我已經分析了一下Ignite內核,並且懷疑某個類加載器中的所有類都會觸發undeploy,但是至少有一個駐留在該類加載器中的類在其他某個加載器中重新部署了。

它發生org.apache.ignite.spi.deployment.local.LocalDeploymentSpi#寄存器

  • 裏面起初,我們得到了一個「中增加了對註冊的類加載器 新資源地圖」使用LocalDeploymentSpi#addResource 。
  • 然後,我們「除去{code ignoreClsLdr}」,刪除所有類加載器的資源。「使用LocalDeploymentSpi#removeResources。在這個方法中,看起來我們將包含舊版本新資源的所有加載程序添加到「註定要失敗」的集合中。
  • 最後,我們迭代這個集合併爲每個元素調用onClassLoaderReleased。後一個操作實際上導致所有的類都被取消部署(最終導致「Removed undeployed class」消息)。

我不明白這個概念。爲什麼會有多個類加載器?爲什麼我們在這種情況下取​​消部署整個類加載器?

我很感激,如果有人能解釋一下,點對點類加載是如何在Ignite中「引擎蓋下」工作的。

P.S.我正在查看Ignite 2.1.0的新快照的來源,但其行爲與標準Ignite 1.9.0的行爲相同。

回答