2009-09-28 53 views
1

我什至不知道下面是可能的,但它絕不會傷害問:生成的有限範圍內唯一的數字超過一個節點

我必須運行同一應用程序的兩個節點。每臺機器都需要一個序列發生器,它會給它一個介於0和1e6之間的數字。如果一個節點使用了一個數字,另一個節點就不能使用它。發電機應在午夜重置每晚。即使機器重新啓動,也不應在同一天使用兩次。我們希望避免涉及數據庫,分佈式緩存或文件系統的任何解決方案。假設我們每天不會需要超過1e6個數字。數字不必按順序使用。

到目前爲止,我們已經想到了以下內容:

1)機器A使用奇數,機器B使用偶數。

優點:無共享狀態。

缺點:機器可能沒有足夠的剩餘數量。如果機器重新啓動,它將重新使用以前使用的號碼。

2)機從0到COUNTR 1E6,機器B從1E6至0

優點:沒有共享的狀態。保證所有可用的號碼將在遇到問題前消耗。

缺點:不能擴展到兩臺以上的機器。機器重新啓動時出現同樣的問題。

您認爲如何?有沒有一種神奇的算法可以滿足我們的需求,而無需向磁盤寫入任何內容?

+0

我認爲需要更多背景 - 您使用的數字是什麼,以及您談論了多少個節點?爲什麼你不能使用大於1e6的數字?數字需要多快生成? – 2009-09-28 14:37:22

+0

我想知道你是否真的需要符合這些特定規格的東西...如果你解釋了數字將用於什麼,它可能會有所幫助。 – Thomas 2009-09-28 14:41:13

+0

@標記應用程序基本上是一組外部Web服務的抽象層。其中一項服務要求每個請求都與0至1e6之間的日內唯一ID號相關聯。如果同一個ID在同一天使用兩次,該服務會引發異常。 @Thomas你是絕對正確的,在99.99%的案例中,我不會真的需要這樣一個極端的解決方案,但我很好奇數字理論家是否有解決方案。 – lindelof 2009-09-29 06:01:41

回答

2

爲什麼不只是有一個小的serivce根據要求提供ID?這可擴展到多臺機器,並且如果您需要更改ID分配算法,則不需要更改客戶機。這實現起來相當簡單,並且很容易繼續前進。

3

即使機器重新啓動,也不應在同一天使用兩次。

由於您不想使用任何持久狀態,這表明數字必須以某種方式依賴於時間。這是算法能夠區分兩個不同初創公司的唯一方法。難道你不能只用一個組合(node, timestamp)來獲得足夠好的時間戳,而不是你的數字?

0

我真的認爲最好的方法是讓一些機器將請求發送出去(如果你想避免太多查詢的話,甚至可以是數字範圍),這些機器會將事情寫入磁盤。

如果你真的反對它,如果你能夠確定數字被消費的速度,那麼你可以非常聰明地使用方法1。例如,機器可以使用當前時間來確定開始範圍的哪個位置。 I.E.如果是中午,從我的範圍開始。如果您可以對每秒生成的數字量(或通用時間間隔)設置上限,則可以對其進行調整。這仍然存在浪費標籤的問題,並且爲了避免將單個數字寫入磁盤而相當複雜。

相關問題