Sorry, it looks like images are only visible in the google groups

https://groups.google.com/forum/#!topic/clojure/fRYCowf6VUg

Bruno

On Tue, Jun 21, 2016 at 1:38 PM, Bruno Bonacci <bruno.bona...@gmail.com>
wrote:

>
> <https://lh3.googleusercontent.com/-ZVELcKNoB9M/V2kxgYmlFMI/AAAAAAAAB8Q/nR6jLFjKSI0611-WiQpQHXAcY3SueVIdwCLcB/s1600/Screen%2BShot%2B2016-06-21%2Bat%2B13.21.24.png>
>
>>
>> Another thing I've noticed is that you are using (
>> System/currentTimeMillis) to get the wall clock on every generation.
>>
>> (System/currentTimeMillis) causes a low level system call which in turn
>> causes a context switch.
>>
>> Maybe one way to improve could be use a initial (System/currentTimeMillis)
>> on the first init! and then
>> use System/nanoTime to calculate the time elapsed from the init.
>> The advantage would be that System/nanoTime runs in the UserSpace (not
>> Kernel Space) and it doesn't require
>> a system call (so no context switch).
>>
>> This could really help the case of a bulk production of IDs and any other
>> burst situation.
>>
>>
>> I really like this idea. I’m certainly open to pull requests if you
>> wanted to take a stab at it otherwise I may try my hand at making this
>> improvement. :)
>>
>
> Hi this change it is actually easier than it sounds. Looking at the code,
> I came across a couple of things which I think might be better.
>
> 1) use of filesystem persistence.
>
> Not too sure that the file based persistence is a good idea. Maybe this is
> a good idiomatic design for Erlang, but definitely it doesn't look nice in
> Clojure.
>
> In particular I'm not too sure that by storing the init time epoc we
> actually accomplish anything at all.
> I would argue that there are a number of problems there, race conditions
> on data, tmp file purged out, and still doesn't protect against the case
> the clock drift during the use.
>
> 2) use of CAS (atom) for storing the VM state.
> If if is truly decentralized then you shouldn't need an atom at all. The
> disadvantage of the CAS is that, when many thread race to the same change,
> only one will succeed and all the other ones will fail and retry. Which
> mean that if you have 100 threads (for example) only 1 will succeed all the
> other 99 will fail and retry. Again at the second round only 1 will succeed
> and 98 will retry, and so on.
> Therefore the total number of attempts will be
>
>
> <https://lh3.googleusercontent.com/-ZVELcKNoB9M/V2kxgYmlFMI/AAAAAAAAB8Q/nR6jLFjKSI0611-WiQpQHXAcY3SueVIdwCLcB/s1600/Screen%2BShot%2B2016-06-21%2Bat%2B13.21.24.png>
>
> If you want to develop a real "*decentralized*" id generator, I think,
> you need to drop the atom in favour of a thread local store.
> Now to do so and make collision impossible we need to add more bits:
>
>
>    -     64 bits - ts (i.e. a timestamp )
>    -     48 bits - worker-id/node (i.e. MAC address)
>    -     32 bits - worker-id/process (pid)
>    -     64 bits - worker-id/thread (thread num)
>    -     32 bits - seq-no (i.e. a counter)
>
> By adding the process id (pid) and the thread id there is possibility of
> having two systems running and creating the same id at the same time.
> Finally by using thread-local storage there is no need of process level
> coordination (atom) and no risk of retries because every process is
> stepping on each others toes.
>
> With such setup 100 threads will be able to increment their own thread
> local counter independently (given that you have 100 execution cores).
>
> What do you think?
> Bruno
>
>
>
>>
>> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "Clojure" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojure/fRYCowf6VUg/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to