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


265

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

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

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

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

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

जवाबों:


143

मैंने ऐसी प्रणाली बनाई है और मैंने यह तरीका अपनाया है:

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

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

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

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

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

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

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


3
हां, यह सही है। हाल ही में मैं कुछ परियोजनाओं में MongoDB ( mongodb.org ) का उपयोग कर रहा हूं , जिनकी योजनाबद्ध दृष्टिकोण इस डिजाइन का अनुसरण करने वाली अच्छी तरह से प्रदर्शन करने वाली सामाजिक गतिविधि स्ट्रीम बनाने के लिए बहुत उपयुक्त है।
हाइमन

6
TheApprentice: हाँ, आप एक उपयोगकर्ता नाम फ़ील्ड में भी फेंक सकते हैं। हमारे सिस्टम में, हमने केवल एक उपयोगकर्ता के दोस्तों द्वारा बनाई गई घटनाओं को प्रदर्शित किया है, और मेरा मानना ​​है कि हमारे पास पहले से ही दोस्तों के उपयोगकर्ता का एक नक्शा है-> उपयोगकर्ता नाम स्मृति में, इसलिए उपयोगकर्ता नाम देखने के लिए एक JOIN की आवश्यकता नहीं थी और तेज थे।
हाइमन

2
आपको उस मामले को मैन्युअल रूप से संभालना होगा। संभवतः यह तब करना सबसे अच्छा है जब फोटो हट जाए (उपयोगकर्ता के फ़ीड में फ़ीड आइटम ढूंढें, और इसे हटा दें / अपडेट करें)।
हाइमन

21
मैं इस जवाब के बारे में क्या इतना महान समझ में नहीं आता? फेसबुक के समान भारित गतिविधि फ़ीड के लिए एक सरल तालिका अनुवाद कैसे बनता है? सभी झिझक कर सभी गतिविधि को संग्रहीत कर रहे हैं। जो अभी भी एक गतिशील भारित गतिविधि फ़ीड में डेटा की एक तालिका को चालू करने का प्रश्न छोड़ देता है?
चकली

4
@ChuckKelly: यदि मुझे सही तरीके से याद है, तो 2008 में, जब मैंने जवाब लिखा था, तब फेसबुक फीड बिल्कुल भी नहीं था। यह अपने दोस्तों से सभी गतिविधि के साथ सिर्फ एक कालानुक्रमिक फ़ीड था।
हाइमन

117

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

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


21
^ ^ क्योंकि साइट पर जाकर आपको SO पर वापस आना है। lol
स्टीफन कॉर्विन

1
महान प्रस्तुति जो विस्तार से बताती है कि सिस्टम वास्तविक उच्च-यातायात वेबसाइट पर कैसे काम करता है।
रामिरमी

44

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

स्ट्रीम फ्रेमवर्क बनाने वाली वही टीम एक होस्टेड API भी प्रदान करती है, जो आपके लिए जटिलता को संभालती है। Getstream.io पर एक नजर डालें, इसमें Node, Python, Rails और PHP के क्लाइंट उपलब्ध हैं।

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

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

फीड डिज़ाइन के बारे में अधिक जानने के लिए, मैं कुछ ऐसे लेखों को पढ़ने की सलाह देता हूँ जिन पर हम फीडली आधारित हैं:

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


19

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

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

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


टिम, क्या आप किसी भी अवसर पर प्रस्तुति या प्रस्तुतकर्ता का नाम याद करते हैं?
दनिता

यह ओरेली और एसोसिएट की इग्नाइट बोस्टन प्रस्तुति में नंबर 3 या 4- पर था, मेरा मानना ​​है कि प्रस्तुतकर्ता के पास ओआरली के साथ आरओआर को स्केल करने पर एक किताब थी। क्षमा करें, मैं अधिक विशिष्ट नहीं हो सकता!
टिम हावलैंड

धन्यवाद टिम :) वैसे, "लघु सामाजिक नेटवर्क" के साथ आपका क्या मतलब था? एक निश्चित समय में कितने उपयोगकर्ता, या सक्रिय उपयोगकर्ता?
दानिता

3
यदि किसी को इसकी आवश्यकता है, तो मुझे लगता है कि यह वह प्रस्तुति है जिसके बारे में टिम बात कर रहा है: "दान चक - आपकी समस्याओं के आकार में स्केलिंग" radar.oreilly.com/2008/09/ignite-boston-4@gvideos -रूपलो।
दानिता

इस मामले में स्मालिश इस तरह की है कि "उन घटनाओं से" का चयन करें जहां Event.is इस उपयोगकर्ता के लिए दिखाई देता है "एक दूसरे या दो से कम परिणाम देता है - घटनाओं के लायक कुछ सौ हजार पंक्तियां।
टिम हावलैंड

12

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

एल्गोरिदम को एक स्वसंपूर्ण REST सर्वर के रूप में कार्यान्वित किया गया है ताकि आप गतिविधि स्ट्रीम देने के लिए अपने स्वयं के सर्वर को होस्ट कर सकें: 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 से अधिक स्ट्रीम प्राप्त करने में सक्षम है)।


10

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

मैंने गुण Id , ActorId , TypeId , Date , ObjectId और अतिरिक्त विवरण कुंजी / मान जोड़े के हैशटेबल के साथ एक स्ट्रीम क्लास बनाया । यह एक StreamEvent तालिका ( Id , ActorId , TypeId , Date , ObjectId ) और एक StreamEventDetails तालिका ( StreamEventId , DetailKey , DetailValue ) द्वारा डेटाबेस में दर्शाया गया है

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

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

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

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

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

किसी भी टिप्पणी की बड़े पैमाने पर सराहना की जाएगी।


मैं इस तरह की प्रणाली पर काम कर रहा हूं, इस पर किसी भी ज्ञान में बहुत दिलचस्पी है, क्या आपने कभी अपना काम पूरा किया?
जेसनडेविस

बहुत बढ़िया जवाब! चिंताओं का उत्कृष्ट अलगाव, स्वच्छ और सुरुचिपूर्ण!
मॉस

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

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

// प्रति ईवेंट एक प्रविष्टि, प्रति ईवेंट जिसमें वह ईवेंट है
इवेंट_फीड
  Event_id, feed_id
}

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


1
मान लीजिए कि इस घटना के जुड़ने के बाद किसी और को एक मित्र के रूप में जोड़ा गया है, तो इस घटना को उनके फ़ीड में देखने की आवश्यकता है? तो यह काम नहीं होगा
यहोशू Kissoon

8

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

एक्टिविटीस्ट्रीम: http://github.com/face/activity_streams/tree/master

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


6

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

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

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

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

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

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


वास्तव में मेरे विचार, मुझे बस अपने विचारों की एक मान्यता की आवश्यकता थी जो मुझे अब मिल गया है, चीयर्स!
सोहेल

5

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

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


1
सार्वजनिकता महान है, और प्रश्न में उपयोग के सभी मामलों को संभाल सकती है।
डेवस्टेफेंस

3

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

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


2

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

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"}

2

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.