2013-05-24 20 views
6

Sabah herkesEn iyi erlang bellek önbellek sistemi çapraz ağ düğümleri = mnesia?

Ben erlang için yeniyim ama 1 projemi erlang üzerinde olabildiğince iyi olacak şekilde tasarlamaya çalışıyorum. Burada erlang bellek içi önbellek sistemi için bir öneriye ihtiyacım var.

  1. Önbellek öğesi anahtar-değer tabanlı depolamadır. anahtarı genellikle bir ASCII dizgisidir; değer, erlang'ın türlerini içerir: sayı/liste/tuple/vb.
  2. Önbellek öğesi, düğümünden herhangi biri tarafından ayarlanabilir.
  3. Önbellek öğesinin düğümünden biri tarafından alınabilir.
  4. Önbellek öğesi, farklı sunucularda bile çapraz tüm düğümleri paylaşır
  5. Kirli okumaya izin verilir, performansı azaltmak için herhangi bir kilit veya işlem istemiyorum.
  6. Tamamen dağıtılmış, merkezi bir makine veya hizmet yoktur.
  7. İyi performans
  8. Kolay yüklemek & dağıtım & yapılandırma & bakım

İlk seçim gibi geliyor bana mnesia olduğunu, ama üzerinde hiçbir experence. Benim gereksinimimi karşılar mı? Performans nasıl bekleyebilir?

Başka bir seçenek için memcached - Ama korkarım ki, başka bir işletim sistemi sürecinden memcached daemon olduğundan ekstra seri hale getirme/serpiştirme yapılıyor çünkü performans mnesia'dan daha düşük.

Herhangi bir öneride bulunmanız yararlı olur :)

cevap

10

Evet. Mnesia gereksinimlerinizi karşılar. Ancak, dediğiniz gibi, bir araç onu kullanan kişi derinlemesine anladığında iyidir. Biz bir distributed authentication system mnesia kullandık ve şu ana kadar herhangi bir sorun yaşamadık. Mnesia bir önbellek olarak kullanıldığında, memcached'den daha iyi durumdadır, çünkü "Memcached yazdığınız şeyi garanti edemez, her an okuyabilir, çünkü bellek takas sorunları ve şeyler yüzünden" (here).

Bununla birlikte, dağıtılan sisteminizin Erlang üzerinden kurulacağı anlamına gelir. Aslında sizin durumunuzdaki mnesia, çoğu NoSQL önbellek çözümlerini atıyor çünkü sistemleri Eventually consistent. Mnesia, kümelenme boyunca ağ kullanılabilirliği sağlandığı sürece tutarlıdır. Dağıtılmış bir önbellek sistemi için, farklı düğümlerden aynı anahtar için farklı değerler okuduğunuz bir durum istemezsiniz, dolayısıyla mnesia'nın tutarlılığı burada işe yarar.

Üzerinde düşünmeniz gereken bir şey, dağıtılmış bir sistem için merkezi bir Bellek önbelleğinin bulunmasıdır. Bu şekilde çalışır: Her Küme düğümünde AMQP istemcileri tarafından çalıştırılan ve erişilen RABBITMQ sunucunuz vardır. Sistemler AMQP arayüzü üzerinden etkileşir. Çünkü önbellek merkezi, tutarlılık, önbellekten yazma ve okumadan sorumlu süreç/sistem tarafından sağlanır. Diğer sistemler bir anahtar için bir istekte bulunurlar, AMQP message bus'a ve önbellekten sorumlu sistem bu mesajı alır ve değer ile birlikte yanıtlar.

Message bus Architecture using RABBITMQ, bankacılık sistemleri, bir ERP sistemi ve Genel çevrimiçi hizmet ile bütünleşmeyi içeren yeni bir sistem için kullandık. Bütün bunları bir araya getirmekten sorumluyuz ve RABBITMQ'u kullandığımıza sevindik.Ayrıntılar çoktur ama yaptığımız şey bir mesaj formatı ve bir sistem tanımlama mekanizması ile ortaya çıkmaktır. Tüm sistemlerin, mesaj veriyolundan yazma ve okuma için bir RABBITMQ istemcisi olması gerekir. Daha sonra, her sistem için bir Queue okuyacaksınız, böylece diğer sistem isteklerini, RABBITMQ içindeki adı, sisteme sahip olan sistemle aynı olan sıraya yazacaktır. Sonra, daha sonra, otobüsten geçen mesajları şifrelemelisiniz. Sonunda, büyük mesafeler/eyaletler boyunca birbirine bağlı sistemler var, ancak verimli bir ağ ile, RABBITMQ'un bu sistemleri ne kadar hızlı bağladığına inanmayacaksınız. Her neyse, RABBITMQ da kümelenmiş olabilir ve size RABBITMQ (size ne kadar iyi mnesia olabileceğini söyleyen) Mnesia olduğunu söylemeliyim.

Başka bir şey de, bu konuya değinceye kadar bir çok program okumalı ve yazmalısınız.

+0

Detaylı öneriniz için teşekkürler. Merkezi önbellek sistemi yerine bir tür yerel bellek içi önbellek çözümünü tercih ederim. Merkezi önbellek sistemi, ağ iletişimi gecikmesi ve nesnenin depolanan ikili veya dizgeden/seriye serileştirilmesi/serileştirilmesi için ekstra maliyet anlamına gelir. Durumumda, çok küçük önbellek öğem var ve bir HTTP isteğinde, 1 yüz öğeye kadar sorgulayabilirim ama bir toplu işte değil. Bu durumda, merkezi bir önbellek sistemi benim için uygun görünmüyor. Mnesia'nın önbelleği başka makinelerden talep etmesini önlemek için bir çeşit yerel önbellek var mı? –

+0

Evet. Her düğümün aynı veritabanının bir mnesia kopyası varsa, tutarlılık kümelenme çapında olacaktır. Her zaman. her an, herhangi bir küme düğümünden okuduğunuz şey, nerede olduğuyla aynı olacaktır. Ancak, bu ağ erişilebilirliği ve dağıtılmış sisteme katılan tüm düğümlerde mnesia kullanılabilirliği hakkında varsayımları vardır. –

İlgili konular