2012-10-28 49 views
3

我一直在使用Web應用程序很長一段時間。但是,我從來沒有研究過託管爲多個實例並負載均衡的Web應用程序。在Web應用程序中水平擴展寫入一致性

我的問題:Web應用程序如何管理同一應用程序的多個實例的寫入操作?

例如:訂票網站。想象一下,我會阻止特定行中的電影席位並提交我的請求。同時,另一個用戶(由其他實例通過應用程序進行集羣和負載均衡服務)也阻止了我選擇的其中一個席位,Web應用程序如何管理此場景?因爲它們是在不同的機器上運行的不同的進程,鎖定發生在哪裏?他們如何保持緩存一致性?有沒有解決方案可用?

+0

你的後端是什麼?你使用數據庫嗎?哪一個? – 2012-10-28 13:35:12

+0

@Tichodroma。我們不會很快切換到負載均衡的應用程序。我對這個學術感興趣。不過,我熟悉SQL Server,Spring Transaction管理和JBoss緩存中的鎖定和事務隔離級別。有了我的這個背景,如果你能指點我一些能夠增強我對分佈式應用程序理解的文章,我將不勝感激。謝謝。 – Gopal

回答

7

那麼,在單節點應用程序中,您仍然會遇到與併發寫入相同的問題,因爲它是一個JVM,所以它們更容易管理它們。

因爲他們是不同的進程在不同的機器上運行,哪裏發生鎖定?

數據庫是所有實例共享的單點,是最簡單的目標。根據您的預期負載和使用情況,optimistic locking非常容易實現(example in JPA)。結合數據庫事務,您可以達到一定的原子級別,而無需交易性能。

他們如何保持緩存一致性?有沒有解決方案可用?

緩存很難,特別是在分佈式環境中。例如可以在實例之間進行通信,並且一旦緩存在一個實例中發生更改,它就會將此事件廣播到其他節點。還有很多其他產品,如,

+0

感謝您的快速回復。你可以分享一些博客帖子如何實現樂觀鎖定? – Gopal

+1

@Gopal:我添加了幾個鏈接到我的答案 –

+0

Tomasz Nurkiewicz ..感謝您的回答。我昨天正在重溫這個問題,你的回答很有幫助。 – Gopal

1

我在訂票後臺工作了幾年。通常,在這種情況下,整個Web應用程序都由數據庫支持,並且座位具有不同的狀態:可用,阻止,預訂。

下面是它如何工作的:

  • 用戶A和B進入Web應用程序,既看到,座椅S是可用的。
  • 用戶A選擇座椅S在數據庫中,對於S發生變化從availablebooked
  • 用戶B的狀態下嘗試選擇座椅S後端的答覆,座椅S是blocked,和用戶B看到錯誤信息。

您可以通過使用Ajax來更新座位狀態'實時',使您的應用更加用戶友好。