दिलचस्प पोस्ट
$ _POST के साथ अपरिभाषित सूचकांक सीएसएस में प्रत्येक एनथ एलिमेंट चुनें User.config का कस्टम पथ सूची से संग्रह संग्रह .toMap () ऑर्डर कैसे रखना है? इकाई फ़्रेमवर्क 4.3.1 में माइग्रेशन को अक्षम कैसे करें? आईओएस 5 में मजबूत और कमजोर भंडारण की व्याख्या एंड्रॉइड Uri.getPath () द्वारा असली पथ प्राप्त करें एंड्रॉइड आंतरिक / बाह्य मेमोरी का मुफ्त आकार मिलता है एंड्रॉइड में बटन घटनाओं को परिभाषित करने के लिए सर्वश्रेष्ठ अभ्यास टैबलोलिंक्स के साथ कोणीय जेल का उपयोग करना नोटपैड ++ वृद्धिशील रूप से प्रतिस्थापित करें क्यों strtok () अनिर्धारित माना जाता है? क्रिकइन्फो स्कोरकार्ड की html पार्सिंग JQuery के साथ सीएसएस संपत्ति का केवल अंकीय भाग कैसे प्राप्त करें? मेरी वेबसाइट पर आईओएस 5 सफारी रीडर कैसे सक्षम करें?

एक सामाजिक गतिविधि स्ट्रीम को लागू करने का सबसे अच्छा तरीका क्या है?

मुझे आपकी राय सुनने में दिलचस्पी है जिसमें एक सामाजिक गतिविधि स्ट्रीम को लागू करने का सबसे अच्छा तरीका है (फेसबुक सबसे प्रसिद्ध उदाहरण है)। इसमें शामिल समस्याएं / चुनौतियां हैं:

  • विभिन्न प्रकार की गतिविधियां (पोस्टिंग, टिप्पणी करना ..)
  • वस्तुओं के विभिन्न प्रकार (पोस्ट, टिप्पणी, फोटो ..)
  • 1-एन उपयोगकर्ताओं को विभिन्न भूमिकाओं में शामिल ("यूज़र एक्स ने यूजर के जेड पोस्ट पर उपयोगकर्ता की टिप्पणी का जवाब दिया")
  • एक ही गतिविधि मद के अलग-अलग दृश्य ("आपने टिप्पणी की है .." बनाम "आपका मित्र एक्स टिप्पणी" बनाम "उपयोगकर्ता एक्स ने टिप्पणी की .." => 3 "टिप्पणी" गतिविधि के अभ्यावेदन)

.. और कुछ और, खासकर यदि आप इसे उच्च स्तर के परिष्कार में लेते हैं, जैसे कि फेसबुक करता है, उदाहरण के लिए, कई गतिविधि वस्तुओं को एक में जोड़कर ("प्रयोक्ता x, y और z उस तस्वीर पर टिप्पणी करते हैं"

ऐसी प्रणाली, डेटा मॉडल, आदि को लागू करने के लिए सबसे अधिक लचीली, कुशल और शक्तिशाली तरीकों पर पैटर्न, कागजात, आदि पर कोई विचार या संकेत दिए जाएंगे।

यद्यपि अधिकांश मुद्दों में प्लेटफार्म-अज्ञेयवादी होते हैं, तो संभावना है कि मैं रूबी पर रेल एक ऐसे सिस्टम को लागू कर रहा हूं

Solutions Collecting From Web of "एक सामाजिक गतिविधि स्ट्रीम को लागू करने का सबसे अच्छा तरीका क्या है?"

मैंने ऐसी व्यवस्था बनाई है और मैंने यह दृष्टिकोण लिया:

निम्न स्तंभों के साथ डेटाबेस तालिका: आईडी, यूजर आईडी, प्रकार, डेटा, समय।

  • userId उपयोगकर्ता है जो गतिविधि उत्पन्न करता है
  • प्रकार की गतिविधि का प्रकार है (यानी ब्लॉग पोस्ट किया गया, फ़ोटो जोड़ा गया, उपयोगकर्ता की फ़ोटो पर टिप्पणी की गई)
  • डेटा गतिविधि के लिए मेटा- डेटा वाला एक क्रमबद्ध ऑब्जेक्ट है जहां आप चाहते हैं कि आप जो भी डाल सकते हैं

यह खोजों / खोजों को सीमित करता है, आप उपयोगकर्ताओं को, समय और गतिविधि प्रकारों के लिए फ़ीड में कर सकते हैं, लेकिन एक फेसबुक-प्रकार की गतिविधि फ़ीड में, यह वास्तव में सीमित नहीं है। और मेज पर सही इंडेक्स के साथ लुकअप तेज हैं

इस डिजाइन के साथ आपको यह तय करना होगा कि प्रत्येक प्रकार के ईवेंट को किस मेटाडेटा की आवश्यकता होनी चाहिए। उदाहरण के लिए, एक नई तस्वीर के लिए एक फ़ीड गतिविधि कुछ ऐसा दिखाई दे सकती है:

{id:1, userId:1, type:PHOTO, time:2008-10-15 12:00:00, data:{photoId:2089, photoName:A trip to the beach}} 

आप यह देख सकते हैं कि, हालांकि तस्वीर का नाम सबसे निश्चित रूप से फ़ोटो से युक्त किसी अन्य तालिका में संग्रहीत होता है, और मैं वहां से नाम पुनः प्राप्त कर सकता हूं, मैं मेटाडाटा फ़ील्ड में नाम का डुप्लिकेट कर दूंगा, क्योंकि आप ऐसा नहीं करना चाहते यदि आप गति चाहते हैं, तो कोई भी अन्य डेटाबेस तालिकाओं में जुड़ जाता है और प्रदर्शित करने के लिए, 200 बताओ, 50 अलग-अलग उपयोगकर्ताओं से अलग-अलग इवेंट्स, आपको गति की आवश्यकता है

फिर मेरे पास ऐसे वर्ग हैं जो विभिन्न प्रकार की गतिविधि प्रविष्टियों को प्रदान करने के लिए एक बुनियादी फीडविटिव क्लास प्रदान करते हैं। घटनाओं का समूहीकरण, प्रतिपादन कोड में भी बनाया जाएगा, डेटाबेस से जटिलता को दूर रखने के लिए।

यह एक बहुत अच्छी प्रस्तुति है, जिसमें बताई गई कि Etsy.com ने अपनी गतिविधि धाराओं का निर्माण किया था। यह विषय पर मैंने पाया सबसे अच्छा उदाहरण है, हालांकि यह विशिष्ट रेल नहीं है

http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture

हमने अपना दृष्टिकोण खोला है: https://github.com/tschellenbach/Stream-Framework वर्तमान में इस समस्या को हल करने के उद्देश्य से सबसे बड़ा ओपन सोर्स लाइब्रेरी है।

एक ही टीम जो स्ट्रीम फ़्रेमवर्क का निर्माण करती है, एक होस्ट एपीआई भी प्रदान करती है, जो आपके लिए जटिलता को संभालती है Getstream.io पर एक नज़र डालें, नोड, पायथन, रेल और PHP के लिए क्लाइंट उपलब्ध हैं I

इसके अलावा इस उच्च स्केलेबिलिटी पोस्ट पर एक नजर डालें, जिसमें हम कुछ डिजाइन निर्णयों को शामिल करते हैं: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic- feeds.html

यह ट्यूटोरियल आपको रीडिस का उपयोग करते हुए Pinterest की फीड जैसे सिस्टम को सेटअप करने में मदद करेगा। इसके साथ शुरू करना काफी आसान है

फ़ीड डिजाइन के बारे में अधिक जानने के लिए मैं उन लेखों को पढ़ने की बहुत अनुशंसा करता हूं जिन पर हम Feedly पर आधारित थे:

  • याहू रिसर्च पेपर
  • फ़ेबैक के साथ ट्विटर 2013 रेडिस आधारित है
  • Instagram पर Cassandra
  • Etsy फ़ीड स्केलिंग
  • फेसबुक का इतिहास
  • अच्छा नामकरण सम्मेलनों के साथ डीजेंगो प्रोजेक्ट (लेकिन डेटाबेस केवल)
  • http://activitystrea.ms/specs/atom/1.0/ (अभिनेता, क्रिया, वस्तु, लक्ष्य)
  • सर्वोत्तम प्रथाओं पर क्वाटर पोस्ट
  • Quora एक सामाजिक नेटवर्क फ़ीड स्केलिंग
  • रेडिस रूबी उदाहरण
  • FriendFeed दृष्टिकोण
  • थूनक सेटअप
  • चहचहाना का दृष्टिकोण

हालांकि स्ट्रीम फ़्रेमवर्क पायथन आधारित है, लेकिन रूबी ऐप से इसका उपयोग करना बहुत मुश्किल नहीं होगा। आप इसे आसानी से एक सेवा के रूप में चला सकते हैं और इसके सामने एक छोटे से http एपीआई छड़ी कर सकते हैं। हम फीडली को अन्य भाषाओं से एक्सेस करने के लिए एपीआई जोड़ने पर विचार कर रहे हैं। फिलहाल आपको अपनी खुद की भूमिका निभानी होगी।

घटना धाराओं के साथ सबसे बड़ी समस्याएं दृश्यता और प्रदर्शन हैं; आप उस विशेष उपयोगकर्ता के लिए केवल दिलचस्प व्यक्ति होने के लिए प्रदर्शित होने वाले ईवेंट को प्रतिबंधित करना चाहते हैं, और आपको उन घटनाओं को संभालने में सक्षम होने के लिए समय की मात्रा को रखने की जरूरत है मैंने एक छोटे से सोशल नेटवर्क बनाया है; मुझे पता चला कि छोटे पैमाने पर, डेटाबेस में एक "ईवेंट" तालिका रखते हुए काम करता है, लेकिन यह मध्यम भार के तहत एक प्रदर्शन समस्या हो सकती है।

संदेशों और उपयोगकर्ताओं की एक बड़ी धारा के साथ, एक मैसेजिंग सिस्टम के साथ जाने के लिए संभवतः सबसे अच्छा है, जहां इवेंट अलग-अलग प्रोफाइल के लिए संदेश के रूप में भेजे जाते हैं इसका मतलब यह है कि आप लोगों की इवेंट स्ट्रीमों की आसानी से सदस्यता नहीं ले सकते हैं और पिछली घटनाओं को बहुत आसानी से देख सकते हैं, लेकिन जब आप किसी विशिष्ट उपयोगकर्ता के लिए स्ट्रीम रेंडर करना चाहते हैं, तो आप बस संदेशों के एक छोटे से समूह का अनुवाद कर रहे हैं।

मेरा मानना ​​है कि यह चहचहाना मूल डिजाइन दोष था- मुझे याद है कि वे डेटाबेस खींचने के लिए और अपनी घटनाओं को फ़िल्टर करने के लिए मार रहे थे। यह आर्किटेक्चर के साथ सब कुछ था और रेल के साथ कुछ नहीं करना था, जो (दुर्भाग्यवश) ने "रूबी मेम" को जन्म नहीं दिया। मैंने हाल ही में एक प्रस्तुति देखी जहां डेवलपर ने अमेज़ॅन की सरल कतार सेवा का इस्तेमाल ट्विटर के समान आवेदन के लिए अपने मैसेजिंग बैकएंड के रूप में किया था जो कि उच्च स्केलिंग क्षमताओं के बराबर होगा- यह आपके सिस्टम के भाग के रूप में एसक्यूएएस में देखने के योग्य हो सकता है, अगर आपके लोड काफी अधिक हैं ।

यदि आप एक अलग सॉफ़्टवेयर का उपयोग करने के लिए तैयार हैं, तो मैं सुझाव देता हूं कि ग्राफिटी सर्वर जो गतिविधि की धाराओं के लिए समस्या को हल करता है (neo4j ग्राफ डेटा बेस के शीर्ष पर स्थित)।

एल्गोरिदम को एक स्टैंडअलोन रेस्ट सर्वर के रूप में लागू किया गया है ताकि आप गतिविधि धाराओं को वितरित करने के लिए अपना स्वयं का सर्वर होस्ट कर सकें: http://www.rene-pickhardt.de/graphity-server-for-social-activity-streams-released-gplv3 /

पेपर और बेंचमार्क में मैंने दिखाया कि समाचार स्ट्रीम को पुनः प्राप्त करने से केवल किसी भी अतिरेक के बिना प्राप्त किए जाने वाले वस्तुओं की मात्रा पर रेखीय निर्भर होता है जो आप डेटा को अस्वीकृत करने से प्राप्त होता है:

http://www.rene-pickhardt.de/graphity-an-efficient-graph-model-for-retrieving-the-top-k-news-feeds-for-users-in-social-networks/

उपर्युक्त लिंक पर आपको स्क्रीनकास्ट और इस दृष्टिकोण का एक बेंचमार्क मिलता है (दिखा रहा है कि ग्राफि प्रति सेकंड 10k से अधिक स्ट्रीम प्राप्त करने में सक्षम है)।

मैंने कल की तरह एक प्रणाली को लागू करना शुरू कर दिया, यहाँ वह जगह है जहां मुझे मिल गया …

मैंने प्रॉपर्टीज आईडी , एक्टोरआईड , टाइपआईडी , डेट , ऑब्जेक्ट और अतिरिक्त विवरण कुंजी / मान जोड़े के एक हैशटेबल के साथ एक स्ट्रीमइवेंट क्लास बनाया है। यह स्ट्रीम ईवेंट टेबल ( आईडी , एक्टोरआईड , टाइपआईडी , दिनांक , ऑब्जेक्ट ) और एक स्ट्रीमइवेंट डिलीट टेबल ( स्ट्रीमइवेंटआईडी , डिटेन्टेकी , डिफेंटल वैल्यू ) द्वारा डेटाबेस में दर्शाया गया है

ActorId , TypeId और ObjectId एक विषय- verb- ऑब्जेक्ट की अनुमति के लिए कब्जा कर लिया (और बाद में पूछताछ)। प्रत्येक कार्रवाई के परिणामस्वरूप कई स्ट्रीम ईवेंट उदाहरण बनाए जा सकते हैं।

मैंने फिर से प्रत्येक प्रकार की घटनाओं के लिए स्ट्रीम एवेंट के लिए एक उप-कक्षा बनाई है, जैसे कि LoginEvent , PictureCommentEvent । इनमें से प्रत्येक उप-वर्गों में चित्रित , थंबनेल , कॉमनटेक्स्ट , इत्यादि (जो ईवेंट के लिए जरूरी है) जैसे अधिक विशिष्ट विशिष्ट गुण हैं, जो वास्तव में हैशटेबल / स्ट्रीम एवेंट डिलेट तालिका में कुंजी / मान जोड़े के रूप में संग्रहीत हैं।

जब इन घटनाओं को डेटाबेस से वापस खींचते हैं, तो मैं सही StreamEvent वर्ग बनाने के लिए फ़ैक्टरी विधि ( TypeId के आधार पर) का उपयोग करता हूं।

स्ट्रीम एवेंट के प्रत्येक उपवर्ग में एक रेंडर है ( प्रसंग के रूप में प्रारम्भिकांटेक्स्ट) विधि जो पारित स्ट्रीमकॉन्टेक्स्ट क्लास के आधार पर स्क्रीन पर ईवेंट प्रदर्शित करता है। स्ट्रीम कंसटेंस्ट क्लास दृश्य के संदर्भ के आधार पर विकल्पों को सेट करने की अनुमति देता है। उदाहरण के लिए यदि आप फेसबुक पर गौर करते हैं तो होमपेज पर आपकी न्यूज फीड में प्रत्येक एक्शन में शामिल हर व्यक्ति के पूर्णनाम (और उनकी प्रोफ़ाइल के लिंक) की सूची है, जबकि एक दोस्त की फीड को देखकर आप केवल अपना पहला नाम देखते हैं (लेकिन अन्य कलाकारों का पूरा नाम) ।

मैंने अभी तक एक समग्र फ़ीड (फेसबुक होम) को लागू नहीं किया है, लेकिन मुझे लगता है कि मैं एक समेकित फीड तालिका बनाऊँगा जिसमें फ़ील्ड यूज़रआईड , स्ट्रीम एवेन्टआईडी है , जो किसी प्रकार के 'हममम के आधार पर आबादी है, आपको यह रोचक' एल्गोरिथम मिल सकता है।

किसी भी टिप्पणी की व्यापक सराहना की जाएगी।

 // एक प्रविष्टि प्रति वास्तविक घटना
 आयोजन {
   आईडी, टाइमस्टैंप, प्रकार, डेटा
 }

 // प्रति घटना एक प्रविष्टि, उस घटना के साथ प्रति फ़ीड
 events_feeds {
   event_id, feed_id
 }

जब ईवेंट बनाया जाता है, तो यह तय करें कि यह किस फ़ीड्स में दिखाई देता है और ईवेंट_feeds में उनको जोड़ता है फीड प्राप्त करने के लिए, ईवेंट_ फीड्स से चुनें, ईवेंट में शामिल हों, टाइमस्टैम्प द्वारा क्रम। फ़िल्टरिंग और एकत्रीकरण तब उस क्वेरी के परिणामों पर किया जा सकता है। इस मॉडल के साथ, आप बिना अतिरिक्त काम के निर्माण के बाद ईवेंट गुण बदल सकते हैं।

यदि आप यह तय करते हैं कि आप रेल में कार्यान्वित करने जा रहे हैं, तो शायद आपको निम्न प्लगइन उपयोगी मिलेगा:

गतिविधि धारा: http://github.com/face/activity_streams/tree/master

यदि और कुछ नहीं, तो आप डेटा मॉडल के संदर्भ में, साथ ही गतिविधियों को आगे बढ़ाने और खींचने के लिए एपीआई प्रदान करने के लिए कार्यान्वयन को देखने के लिए मिलेंगे।

मुझे हेइमैन के समान दृष्टिकोण था – एक denormalized तालिका जिसमें उन सभी डेटा शामिल हैं जो किसी दिए गए गतिविधि स्ट्रीम में प्रदर्शित होंगे। यह सीमित गतिविधि के साथ एक छोटी साइट के लिए ठीक काम करता है

जैसा कि ऊपर उल्लेख किया गया है, यह स्केलेबिलिटी मुद्दों का सामना करने की संभावना है क्योंकि साइट बढ़ती है। व्यक्तिगत रूप से, मैं अभी स्केलिंग मुद्दों के बारे में चिंतित नहीं हूं। मैं उस बारे में बाद के समय में चिंता करूंगा

फेसबुक ने स्पष्ट रूप से स्केलिंग का एक अच्छा काम किया है इसलिए मैं सुझाव देता हूं कि आप अपने इंजीनियरिंग ब्लॉग को पढ़ लें, क्योंकि इसमें एक महान सामग्री है -> http://www.facebook.com/notes.php?id=9445547199

मैं उपरोक्त उल्लिखित विकृत तालिका की तुलना में बेहतर समाधान देख रहा हूं मुझे पूरा करने का एक और तरीका यह है कि सभी सामग्री जो एक ही पंक्ति में किसी दिए गए गतिविधि स्ट्रीम में होगी। इसे XML, JSON या कुछ सीरियलकृत प्रारूप में संग्रहीत किया जा सकता है जो आपके एप्लिकेशन द्वारा पढ़ा जा सकता है। अपडेट प्रक्रिया भी सरल होगी गतिविधि पर, नई गतिविधि को एक कतार में रखें (शायद अमेज़ॅन एसक्यूएएस या कुछ और का उपयोग करना) और फिर अगले आइटम के लिए लगातार कतार का चुनाव करें। वह आइटम पकड़ो, उसे पार्स करें, और इसकी सामग्री को डेटाबेस में संग्रहीत उचित फ़ीड ऑब्जेक्ट में रखें।

इस पद्धति के बारे में अच्छी बात यह है कि आपको केवल एक ही डेटाबेस तालिका को पढ़ने की आवश्यकता होती है, जब भी टेबल की श्रृंखला को हथियाने के बजाय विशेष फ़ीड का अनुरोध किया जाता है इसके अलावा, यह आपको गतिविधियों की एक सीमित सूची को बनाए रखने की अनुमति देता है क्योंकि जब भी आप सूची को अद्यतन करते हैं तब तक आप सबसे पुराना गतिविधि आइटम को पॉप कर सकते हैं।

उम्मीद है की यह मदद करेगा! 🙂

इस तरह की गतिविधि स्ट्रीम के बारे में दो रेलिंग हैं:

उन समाधानों में आपकी सभी आवश्यकताओं को शामिल नहीं किया जाता है, लेकिन यह आपको कुछ विचारों को देना चाहिए।

मुझे लगता है कि प्लर्क का दृष्टिकोण दिलचस्प है: वे एक पूरी तरह से एक प्रारूप में अपनी पूरी समयरेखा प्रदान करते हैं जो Google वित्त के शेयर चार्ट की तरह दिखता है

सोशल नेटवर्किंग नेटवर्क कैसे काम करता है यह देखने के लिए निंग को देखकर ऐसा लग सकता है। डेवलपर पृष्ठ विशेष रूप से सहायक होते हैं

मैंने इसे कुछ महीने पहले हल किया था, लेकिन मुझे लगता है कि मेरा क्रियान्वयन बहुत बुनियादी है
मैंने निम्नलिखित मॉडल बनाए:

 HISTORY_TYPE ID - The id of the history type NAME - The name (type of the history) DESCRIPTION - A description HISTORY_MESSAGES ID HISTORY_TYPE - A message of history belongs to a history type MESSAGE - The message to print, I put variables to be replaced by the actual values HISTORY_ACTIVITY ID MESSAGE_ID - The message ID to use VALUES - The data to use 

उदाहरण

 MESSAGE_ID_1 => "User %{user} created a new entry" ACTIVITY_ID_1 => MESSAGE_ID = 1, VALUES = {user: "Rodrigo"} 

कई अनुप्रयोगों में सामाजिक फीड्स, माइक्रोब्लॉगिंग और सहयोग सुविधाओं को सक्षम करने के लिए गतिविधि स्ट्रीम को क्रियान्वित करने के बाद, मुझे एहसास हुआ कि मूल कार्यक्षमता काफी सामान्य है और इसे किसी बाहरी सेवा में बदल दिया जा सकता है जिसे आप एपीआई के माध्यम से उपयोग करते हैं। यदि आप स्ट्रीम को एक प्रोडक्शन एप्लिकेशन में बना रहे हैं और आपके पास अनूठे या गहरा जटिल जरूरत नहीं है, तो सिद्ध सेवा का उपयोग करने का सबसे अच्छा तरीका हो सकता है। मैं निश्चित तौर पर रिलेशनल डेटाबेस के शीर्ष पर अपने खुद के सरल समाधान को चलाने के लिए उत्पादन अनुप्रयोगों के लिए यह सुझाएगा।

मेरी कंपनी कोलाबिनेट ( http://www.collabinate.com ) इस प्राप्ति से बाहर हो गई, और हमने इसे हासिल करने के लिए एक ग्राफ डेटाबेस के शीर्ष पर एक स्केलेबल, उच्च प्रदर्शन गतिविधि स्ट्रीम इंजन को लागू किया है हमने इंजन के निर्माण के लिए वास्तव में ग्राफिटी एल्गोरिदम का एक प्रकार का उपयोग किया है (@ रिन पिक्शार्ट के प्रारंभिक कार्य से अनुकूलित किया है जो यहां एक उत्तर भी प्रदान किया है)।

यदि आप स्वयं इंजन की मेजबानी करना चाहते हैं या विशिष्ट कार्यक्षमता की आवश्यकता है, तो कोर कोड वास्तव में गैर-वाणिज्यिक उद्देश्यों के लिए खुला स्रोत है, इसलिए आप एक नज़र लेने के लिए स्वागत है।