वेबसाइकिल से पहले हमने मतदान किया था। इसका शाब्दिक अर्थ है क्लाइंट को समय-समय पर (प्रत्येक कुछ सेकंड, या जो भी समय अवधि आपके आवेदन के लिए समझ में आता है), सर्वर को नौकरी की स्थिति जानने के लिए अनुरोध करें।
कई लोगों का उपयोग "अनुकूल" मतदान एक अनुकूलन है। इसमें सर्वर अनुरोध को स्वीकार करता है, और आंतरिक रूप से सर्वर पर, परिवर्तनों की जांच करता है, और कोई भी नहीं होने पर सो जाता है, जब तक कोई विशिष्ट टाइमआउट नहीं पहुंच जाता है या वांछित घटना होती है, जिसे तब क्लाइंट को वापस भेज दिया जाता है।
यदि कोई टाइमआउट पहुंच गया है, तो कनेक्शन बंद हो गया है और ग्राहक को एक और अनुरोध करने की आवश्यकता है। सर्वर कोड निम्नलिखित कुछ ऐसा दिखाई देगा, मान लें कार्यों उनके नाम और हस्ताक्षर के आधार पर समझदार बातें करते हैं:
import (
"net/http"
"time"
)
func PollingHandler(w http.ResponseWriter, r *http.Request) {
jobID := getJobID(r)
for finish := 60; finish > 0; finish-- { // iterate for ~1 minute
status, err := checkStatus(jobID)
if err != nil {
writeError(w, err)
return
}
if status != nil {
writeStatus(w, status)
return
}
time.Sleep(time.Second) // sleep 1 second
}
writeNil(w) // specific response telling client to request again.
}
टाइमआउट को संभालने के लिए context package का उपयोग करें और एक समय समाप्ति के साथ एक संदर्भ बनाने के लिए किया जाएगा एक बेहतर तरीका ।
import (
"net/http"
"time"
"golang.org/x/net/context"
)
func PollingHandler(w http.ResponseWriter, r *http.Request) {
jobID := getJobID(r)
ctx := context.WithTimeout(context.Background(), time.Second * 60)
for {
select{
case <-ctx.Done():
writeNil(w)
default:
status, err := checkStatus(jobID)
if err != nil {
writeError(w, err)
return
}
if status != nil {
writeStatus(w, status)
return
}
time.Sleep(time.Second) // sleep 1 second
}
}
}
यह दूसरा संस्करण सिर्फ समय की एक और अधिक विश्वसनीय राशि में वापस जाने के लिए, विशेष रूप से मामले में जहां checkStatus
एक धीमी कॉल हो सकता है जा रहा है: यह कुछ ऐसा दिखाई देगा।
धन्यवाद, यह उपयोगी है, मैंने मतदान के बारे में सोचा था, लेकिन क्या यह वास्तव में http2 पर रीयलटाइम ऐप्स के लिए जाने का तरीका है ?, अगर राज्य में बदलाव नहीं आया तो अनुरोध क्यों करें? मुझे अनुरोध के बिना क्लाइंट को अनुरोध भेजने के बारे में कुछ भी नहीं मिला। – FPGA
आम तौर पर HTTP सर्वर से ग्राहकों को अनुरोध करने में सक्षम होने की उम्मीद नहीं है। अधिकांश समय आपको क्लाइंट को फ़ायरवॉल किया जाएगा, एनएटी के पीछे, या अन्यथा पहुंच योग्य नहीं है। HTTP2 ठंडा है, लेकिन जब तक कि आप अपनी कुछ नई सुविधाओं का उपयोग नहीं कर रहे हैं (जो कि संभवतः गो के कार्यान्वयन की संभावना नहीं है, इस समय के लिए बहुत कच्चा है), आप केवल HTTP 1.1 के साथ चिपके रह सकते हैं और अच्छे पुराने websockets का उपयोग कर सकते हैं।गो में तैयार होने पर HTTP2 में अपग्रेड लगभग निश्चित रूप से बहुत आसान होगा। – Endophage