Web hizmeti kullanan bir masaüstü tabanlı istemcinin çevrimdışı olarak yerine çalışma yapmanın en iyi yolu nedir?


13

Ortak bir problemi paylaşan üç gelen projem var:

bir web sistemi üzerinde mantığa sahip olmalı ve RESTful web servisi aracılığıyla bu sistemle iletişim kuran yerel bir uygulamaya (örneğin satış noktası) ihtiyaç duyarlar.

Çözümüm

Gelmeyi başardığım çözüm , hizmet çevrimdışı iken, daha kesin olarak, eşzamansız ileti kuyruğu oluştururken , işlemleri depolamak için masaüstü uygulaması ileti kuyruğuna uygulamaktır . Ancak, bu kolay kısımdır (eğer en iyi çözüm ise). Ayrıca veri senkronizasyonu ve çakışma çözümü ile de ilgileniyorum.

Ana sistemin web tabanlı olması gerekmektedir, çünkü paydaşlar tarafından raporlar ve izleme için bir web uygulaması gereklidir ve web hizmetleri çeşitli kuruluşların taleplerini karşılayacaktır.

Masaüstü istemcileri (tercihen ince) Java (daha spesifik olarak Netbeans) ve Symfony2 içeren web sistemi ile uygulanacaktır. Projelerden ikisi, istemci için donanım entegrasyonu gerektirdiğinden, masaüstü uygulamasını web teknolojisi (örneğin Appcelerator Titanium) ile yapmak büyük bir acı olabilir.

Benim sorum

  1. Ölçeklendiren daha iyi bir çözüm nedir, yani minimum çaba ile maksimum verimlilik (ve tercihen yerel işletim için yedek sunucu satın almak gibi ek maliyetler yoktur)?

  2. Bu konuyla daha önce başka kim ilgilenmişti? Sorununuzu nasıl çözdünüz? Hangi dersleri paylaşabilirsiniz?

  3. Senkronizasyon ile nasıl başa çıktınız?

Düzenleme: 3. noktadaki soruma eksik bir parça eklendi

Yanıtlar:


3

Sorunuzun java olduğunu biliyorum, ama bu mesaj otobüsü tarzı mimariyi gerçekten bu tür şeyler için seviyorum .

Temel olarak mesajlar gönderildiğinde potansiyel olarak iki yanıt alırlar. Birincisi yerel önbellekten, ikincisi bağlandıktan sonra sunucudan gelir.

Bu mimariyi (gergedan otobüsü ve nhib) kendinize (MQ ve hib) kolayca adapte edebileceğinizden eminim.


Evet, tam olarak bu tür mesaj odaklı bir mimari arıyordum. Önbellek argümanları ve bağlantınızdaki son cümle beni ikna etti.
dukeofgaming

10

Her şeyi yerel olarak yapın ve periyodik olarak senkronize edin .

İşte ben olsaydım ne yapardım (.NET'teki gibi Java'daki senkronizasyon çerçevesinin farkında değilim).

En son başarıyla bağlandığınızda yerel uygulamada bir zaman damgası koruyun.

Yeniden bağlandığınız zamandan bağımsız olarak, bu zaman damgası yeni verileri almak ve ardından yerel olarak oluşturulan yeni siparişleri göndermek için kullanılır.

Daha sonra iki zaman damgasını koruyacaksınız. Bunlardan biri siparişin ne zaman oluşturulduğunu (yerel veya çevrimiçi) tanımlamak ve diğeri de sunucu tarafından kaydedildiğini tanımlamak için.

Bunun için Message Queuing'i önermiyorum. MQ'yu geçmişte Navision'a bağlı bir e-ticaret sitesi için kullandım. Her şey Navision'da çalıştırıldı ve değişiklikler sipariş durumu ve ürün açıklamaları, fiyatlandırma vb. Dahil olmak üzere MQ aracılığıyla e-ticaret web sitesine gönderildi. MQ aracılığıyla da Navision'a yeni siparişler gönderildi.


Hmmm, bir itme modeli fikrinden hoşlanıyorum, ancak bilgisayar zamanı değiştiğinde veri kaybı olabileceği sorununu görüyorum. BTW, veritabanı tasarımlarımda her kaydın zaman damgalı olması için konvansiyonum var. Neden MQ'yu önermiyorsunuz?
dukeofgaming

Bu doğru, zaman senkronize PC'ler ve UTC kullanmalısınız, ancak şimdi oldukça standart (en azından Windows'ta). MQ bazen gereklidir, ancak geliştirdiğiniz uygulama için çok fazla olacağını düşünüyorum.

Tamam, bu yüzden güvenilirliğe öncelik vermek için masaüstü uygulamasının bağlantısının kesileceğini düşünmek daha iyidir ve bu nedenle masaüstü uygulamasını birinci sınıf bir vatandaş olarak ele almak daha iyidir, ancak yine de MQ'nun yerel veritabanı uygulaması için daha kolay bir yedek olabilir. Ayrıca, tüm CRUD işlemlerini örtük olarak yapmak daha iyi güvenlik olduğunu düşünüyorum. Bu iki nokta hakkında ne düşünüyorsun?
dukeofgaming

@dukeofgaming: Benim durumumda, web dahil olmak üzere herhangi bir POS'tan (ayrıca sipariş emir alma sistemi olarak da kullanılabilir) sipariş alınabilir. Her şey ülke çapında dağıtıldı. Bağlantı kesilmesi durumunda her masaüstünün özerk olması kesinlikle gerekliydi. MQ da bu senaryoda çalışır, bu yüzden ona karşı değilim. Sadece ana sunucular ve istemciler arasında güçlü veri senkronizasyonu uygulamanın daha kolay olduğunu hissediyorum. Bu nedenle, ana sunucuda CRUD işlemi bir seçenek değildi.

2
+1 - geçmişte böyle yapıldığını gördüm. Ayrıca, benzersiz anahtarların (Kılavuzlar) birincil anahtarlar olarak kullanılmasının işleri son derece basitleştirdiğini söyleyebilirim. Bunu yapmak, senkronizasyona ihtiyaç duyduğunuzda hayatınızı gerçekten kolaylaştıran şeylerden biridir.
Scott Whitlock

1

Veya uzak istemcileri sunucuya eşitlemenin işini zorlaştıran zaman zaman bağlı sistem veritabanı uygulamalarına bakmalısınız. (SQL Server SQL CE ile bunu bir dereceye kadar sahiptir, Outlook bunu yapar).

Bu şekilde, tüm değişikliklerinizi yerel olarak küçük bir ayak izi veritabanında (Sürüm / mantıksal zaman damgalarını vb. Tutar, böylece PC saatleri hakkında endişelenmenize gerek kalmaz) yapabilirsiniz ve çevrimiçi olduğunuzda bunu ana ile senkronize edersiniz. sunucusu.

Sistem çoğu zaman çevrimiçi olamadığında REST çözümüne başvurmam.


Dağıtılmış bir veritabanı mı tanımlıyorsunuz? Bu konu hakkında ayrıntılı bilgi verebilir misiniz?
dukeofgaming

Hayır - bu gerçek dünya anlamında dağıtılmış bir db değil. Dağıtılmış bir db genellikle hemen hemen her şeyin çevrimiçi olmasını bekler, ancak aşağı akranlar arasında çoğaltma mantığı burada da geçerlidir. Çoğaltma işini yapmak için bir olanağı olan bazı masaüstü / cihaz veritabanları vardır ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - Tek yapmanız gereken bu cihazı kurmak, db, değişikliklerinizi buraya kaydedin ve bilgisayar ağına bağlandığınızda senkronizasyonu çağırın - bu sizin için ana sunucuya veri aktarımını gerçekleştirecektir.
Subu Sankara Subramanian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.