<div dir="ltr">If you can make do with a partial order rather than a total order, somehow:<div><br></div><div>   <a href="http://www.erlang.org/doc/man/seq_trace.html">http://www.erlang.org/doc/man/seq_trace.html</a></div><div><br></div><div>Basically, Lamport clocks.</div><div><br></div><div>  <a href="http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf">http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf</a></div><div><br></div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">Regards,<br>Michael Turner<br>Executive Director<br>Project Persephone<br>K-1 bldg 3F<br>7-2-6 Nishishinjuku<br>Shinjuku-ku Tokyo 160-0023<br>Tel: +81 (3) 6890-1140<br>Fax: +81 (3) 6890-1158<br>Mobile: +81 (90) 5203-8682<br><a href="mailto:turner@projectpersephone.org" target="_blank">turner@projectpersephone.org</a><br><a href="http://www.projectpersephone.org/" target="_blank">http://www.projectpersephone.org/</a><br><br>"Love does not consist in gazing at each other, but in looking outward together in the same direction." -- Antoine de Saint-Exupéry</div></div>
<br><div class="gmail_quote">On Mon, Apr 20, 2015 at 9:54 PM, Fred Hebert <span dir="ltr"><<a href="mailto:mononcqc@ferd.ca" target="_blank">mononcqc@ferd.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 04/20, Daniel wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I am looking for a global sequence generator in erlang cluster.<br>
<br>
I think erlang:now() is promising, because it is fast enough and “also guarantees that subsequent calls to this BIF returns continuously increasing values”. But I am not quite sure whether this guarantee also works for erlang cluster which have several nodes running on different servers?<br>
<br>
I have read Time and time correction in Erlang (<a href="http://www.erlang.org/doc/apps/erts/time_correction.html" target="_blank">http://www.erlang.org/doc/apps/erts/time_correction.html</a>), but still have no conclusion.<br>
<br>
</blockquote>
<br></span>
There is a very important thing. You did mention *in a cluster*. What you are asking for, a "global sequence" requires putting every call you have into a well-known order where any value can be compared to any value and sorted properly. This is known as a "total order", and requires synchronization.<br>
<br>
This means that doing this requires your nodes to discuss together, and in concert either:<br>
<br>
a) elect a leader to create the sequence values<br>
b) come to an agreement for the sequence of values<br>
<br>
These are very broad lines (the theoretical aspect of it gets mixed in with a lot of fancy consistency model in distributed systems talk).<br>
<br>
You will want this [generally costly] mechanism when:<br>
<br>
- You need an absolute order in the sequence of your events<br>
- You are ready to see potential unavailability when all the nodes in  the system cannot agree on how to allocate the numbers.<br>
<br>
There is no way around it. On the other hand, there are some alternative options: you could decide to have only *some* events ordered. This means that for some values you could definitely say which comes before or after the other, but not for all of them. This is called a 'partial order'.<br>
<br>
It's what would happen if I generated logs on two different nodes and kept the node identifier in the log. When that happens, I know that logs from A are in the right order (I trust their timestamp), but I cannot know if node A's 2015/04/20T12:59:23+00:00 comes before node B's 2015/04/20T12:59:23+00:00: their respective clocks might be off, drifting, or their resolution too low for me to decide.<br>
<br>
So therefore, when sorting logs for these two systems, I can decide whether one came before or after the others from the same node (as long as I used a monotonic clock like erlang:now() to generate the values), but cannot reliably sort logs across nodes.<br>
<br>
The best answer I can personally give you here is not to tell you how to properly generate these numbers, but rather to ask right back about what it is you're trying to accomplish, and why do you believe you need these numbers for?<br>
<br>
If there's a way to get away without the continuously increasing values at a global level, this will be much simpler operationally than trying to maintain healthy clusters that synchronize and block on every ID you want to generate.<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div>