2016-10-31 17 views
7

Uwielbiam szkielet bota, ale chcę go skalować, aby obsługiwać setki, jeśli nie tysiące stron Facebooka, wskazujących na moją pojedynczą instancję bota. Instancja mojego bota różnicuje funkcjonalność według identyfikatora strony przychodzącej lub, jak sądzę, przez aplikację MSFT/tajne identyfikatory.Jeden bot do obsługi tysięcy stron Facebooka.

Wygląda na to, że framework wymaga korespondencji 1: 1 między botem logicznym hostowanym przez MSFT i stroną FB, ale moja instancja pojedynczego bota może obsłużyć tysiące takich stron i aplikacji.

Wygląda na to, że może być konieczne utworzenie unikalnego obiektu ChatConnector i powiązanej instancji UniversalBot dla każdej strony logicznej botów. To jest strasznie nieefektywne w skali, którą sugeruję.

Jednym ze sposobów rozwiązania tego problemu może być rozszerzenie UniversalBot, aby zaakceptować listę wszystkich aplikacji MSFT i tajnych identyfikatorów, które utworzę, ale jeszcze tego nie próbowałem. Po przejrzeniu interfejsu API wygląda na to, że można zarejestrować więcej złączy za pomocą pojedynczej instancji UniversalBot.

UniversalBot: 

/** 
* Registers or returns a connector for a specific channel. 
* @param channelId Unique ID of the channel. Use a channelId of '*' to reference the default connector. 
* @param connector (Optional) connector to register. If ommited the connector for __channelId__ will be returned. 
*/  
connector(channelId: string, connector?: IConnector): IConnector; 

Ale nie jestem pewien, co przekazuję dla channelId, chyba że jest to arbitralna unikalna wartość lokalna.

Sprawdziłem inne/podobne posty tutaj, ale nie znaleziono niczego, co według mnie jest adresowane do mojego problemu. Jeśli się mylę, przepraszam i będę wdzięczny za odniesienie.

Mam nadzieję, że ktoś może mieć lepszy pomysł. Używam Node btw. Dzięki.

+0

Nawet jeśli jest to możliwe, byłbym również zainteresowany ewentualnym ograniczaniem stawek po stronie Microsoftu, jeśli twój bot obsługuje tysiące stron. – K48

+0

@ K48 To dobry punkt, którego bym nie rozważył. Zastanawiam się, czy Bot Framework jest realnym rozwiązaniem długoterminowym. Warto się przyjrzeć. Dzięki. – Jackpile

+0

Tak więc, aby zrozumieć więcej: masz jeden kod, który w zależności od identyfikatora strony na Facebooku robi coś. Następnie masz wiele botów zarejestrowanych w Bot Framework (jest to jedyny sposób na uzyskanie wielokrotności MS App/Secret). Czy wszyscy wskazują ten sam adres URL? I nie chcesz dzielić botów, ponieważ ... nie chcesz zarządzać wieloma wdrożeniami? –

Odpowiedz

1

Zrobione stąd:

Creating a Single Bot Service to Support Multiple Bot Applications

var express = require('express'); 
var builder = require('botbuilder'); 
var port = process.env.PORT || 3978; 
var app = express(); 

// a list of client ids, with their corresponding 
// appids and passwords from the bot developer portal. 
// get this from the configuration, a remote API, etc. 
var customersBots = [ 
    { cid: 'cid1', appid: '', passwd: '' }, 
    { cid: 'cid2', appid: '', passwd: '' }, 
    { cid: 'cid3', appid: '', passwd: '' }, 
]; 

// expose a designated Messaging Endpoint for each of the customers 
customersBots.forEach(cust => { 

    // create a connector and bot instances for 
    // this customer using its appId and password 
    var connector = new builder.ChatConnector({ 
    appId: cust.appid, 
    appPassword: cust.passwd 
    }); 
    var bot = new builder.UniversalBot(connector); 

    // bing bot dialogs for each customer bot instance 
    bindDialogsToBot(bot, cust.cid); 

    // bind connector for each customer on it's dedicated Messaging Endpoint. 
    // bot framework entry should use the customer id as part of the 
    // endpoint url to map to the right bot instance 
    app.post(`/api/${cust.cid}/messages`, connector.listen()); 

}); 

// this is where you implement all of your dialogs 
// and add them on the bot instance 
function bindDialogsToBot (bot, cid) { 
    bot.dialog('/', [ 
    session => { 
     session.send(`Hello... I'm a bot for customer id: '${cid}'`); 
    } 
    ]); 
} 

// start listening for incoming requests 
app.listen(port,() => { 
    console.log(`listening on port ${port}`); 
}); 

Tworzymy różne bot i złączy instancje, które oddają identyfikator aplikacji i hasła dla każdego klienta, a wiązanie go do odpowiedniego API REST, która jest używana przez Bot Framework jako punkt końcowy przesyłania komunikatów.

Kiedy tworzymy instancję bota, wywołujemy metodę bindDialogsToBot, przekazując instancję bota i identyfikator klienta. W ten sposób rejestrujemy identyfikator klienta w jego zamknięciu, dzięki czemu jest on dostępny dla wewnętrznych okien dialogowych.

Podczas połączenia z jednym z interfejsów API REST wykorzystywana jest odpowiednia instancja bota, a poprawny identyfikator klienta może zostać wykorzystany przez wewnętrzną logikę okna dialogowego do przetworzenia żądania (na przykład w celu pobrania konfiguracji klienta/zasady i działać na nich).

Powiązane problemy