2016-04-11 45 views
3

AMQP'den Google'ın Pubsub'a geçme sürecindeyiz. Biz hesaplama motoru kullanıyorsanız beri bizim için en iyi seçim olabilir çekin ve itme servisi ile haberdar olmak için işçi açamıyorGoogle PubSub'ı Golang ile kullanma. Servisi yoklamak için en verimli (maliyet) yol

The docs suggest.

Ayrıca çekme kullanıma bağlı olarak ilave maliyetler gerektirebilir söylüyor: Yoklama kullanılırsa size açılış bağlantıları sık ve hemen onları kapanış eğer

, yüksek ağ kullanımı söz konusu olabilir.

func main() { 
    jsonKey, err := ioutil.ReadFile("pubsub-key.json") 
    if err != nil { 
     log.Fatal(err) 
    } 
    conf, err := google.JWTConfigFromJSON(
     jsonKey, 
     pubsub.ScopeCloudPlatform, 
     pubsub.ScopePubSub, 
    ) 
    if err != nil { 
     log.Fatal(err) 
    } 
    ctx := cloud.NewContext("xxx", conf.Client(oauth2.NoContext)) 

    msgIDs, err := pubsub.Publish(ctx, "topic1", &pubsub.Message{ 
     Data: []byte("hello world"), 
    }) 

    if err != nil { 
     log.Println(err) 
    } 

    log.Printf("Published a message with a message id: %s\n", msgIDs[0]) 

    for { 
     msgs, err := pubsub.Pull(ctx, "subscription1", 1) 
     if err != nil { 
      log.Println(err) 
     } 

     if len(msgs) > 0 { 
      log.Printf("New message arrived: %v, len: %d\n", msgs[0].ID, len(msgs)) 
      if err := pubsub.Ack(ctx, "subscription1", msgs[0].AckID); err != nil { 
       log.Fatal(err) 
      } 
      log.Println("Acknowledged message") 
      log.Printf("Message: %s", msgs[0].Data) 
     } 
    } 
} 

olsa gereken soru bu mesajları çekerek hakkında gitmek için doğru/önerilen yolu olup olmadığını gerçekten:

Biz böylece bir döngü içinde çalışır seferde bir test abone oluşturulan etmişti .

Biz gün boyunca saniyede 100msg hakkında alma. Sonsuz bir döngüde koşturmanın bizi iflas ettirecek ve başka iyi bir örnek bulmayacağından emin değilim. Genelde

cevap

3

, Bulut Pub/Sub aboneleri çekmek için anahtar yapmaktır her zaman olduğundan emin en azından için iyi çalışan bir değere ayarlanır max_messages ile birkaç seçkin Çekme talepleri:

  • oranı Bu iletilerin boyutunu,
  • bu iletilerin boyutunu ve
  • aboneliğinizin iletileri işleyebildiği mesajların oranı.

En kısa sürede bir çekme isteği dönüşleri, başka bir tane düzenlemelidir. Bu, çekme yanıtında size gönderilen iletilerin eşzamansız olarak işlenmesi ve çağrılması anlamına gelir (veya yeni çekme isteğini eşzamansız olarak başlatır). Çıktı veya gecikmenin beklediğiniz gibi olmadığını fark ederseniz, yapılacak ilk şey daha fazla eşzamanlı çekme isteği eklemektir. senin yayınlama hızı son derece düşük olması durumunda

"yoklama kullanılırsa sık bağlantılarını açarak ve bunları hemen kapanıyor eğer yüksek ağ kullanımı söz konusu olabilecek" ifadesi geçerlidir. Bir günde yalnızca iki veya üç mesaj yayınladığınızı, ancak çekme istekleriyle sürekli olarak anket yaptığınızı düşünün. Bu çekme taleplerinin her biri, istekte bulunmaya yönelik bir maliyete neden olur, ancak aslında bir mesajınız olduğunda, birkaç kez hariç, herhangi bir mesaj almazsınız, bu nedenle "mesaj başına maliyet" oldukça yüksektir. Oldukça istikrarlı bir hızda yayınlıyorsanız ve çekme talepleriniz sıfır olmayan sayıda iletiyi döndürüyorsa, ağ kullanımı ve maliyetleri ileti oranına uygun olacaktır. mantıklı mantıklı Tamam

+0

, teşekkürler. Yani, sizce, sonsuz bir döngüde, uyumaksızın koşmak iyi olur mu? – simonmorley

+0

Evet, bir istek tamamlandığında isteği başlatan sonsuz bir döngü oldukça tipiktir. –

+0

Yardım için teşekkürler. – simonmorley