2016-10-07 1 views
1

Je souhaite implémenter la commande slack slash qui doit traiter la fonction pipeline qui prend environ 30 secondes à traiter. Maintenant, puisque Slack commandes de barre oblique ne permet que 3 secondes pour répondre, comment s'y prendre pour implémenter cela. J'ai référé this mais je ne sais pas comment l'implémenter.Réaction Slack slack implémentée en différé

Veuillez patienter en même temps. Je fais cela la première fois. C'est ce que j'ai essayé. Je sais comment répondre avec ok status dans les 3 secondes, mais je ne comprends pas comment appeler à nouveau pipeline

import requests 
import json 
from bottle import route, run, request 
from S3_download import s3_download 
from index import main_func 

@route('/action') 
def action(): 
     pipeline() 
     return "ok" 

def pipeline(): 
     s3_download() 
     p = main_func() 
     print (p) 

if __name__ == "__main__": 
     run(host='0.0.0.0', port=8082, debug=True) 

je suis tombé sur l'article this. L'utilisation d'AWS lambda est-elle la seule solution? Ne pouvons-nous pas le faire complètement en python?

+0

Avez-vous essayé d'utiliser des files d'attente? Dans votre requête get, vous pouvez récupérer les paramètres de la requête et les stocker dans la file d'attente, et votre processus de travail peut traiter la file d'attente et revenir à la réponse attendue. Si ce n'est pas le cas, nous pouvons essayer d'utiliser un cadre de requêtes non bloquant comme utiliser la tornade à la place de la bouteille. – Sirius

+0

Pouvez-vous expliquer avec un extrait ou un pseudo code? votre première approche – Guru

Répondre

2

Quelque chose comme ceci:

from boto import sqs 
@route('/action', method='POST') 
def action(): 
    #retrieving all the required request example 
    params = request.forms.get('response_url') 

    sqs_queue = get_sqs_connection(queue_name) 
    message_object = sqs.message.Message() 
    message_object.set_body(params) 
    mail_queue.write(message_object) 
    return "request under process" 

et vous pouvez avoir un autre processus qui traite la file d'attente et appel longue fonction en cours d'exécution:

sqs_queue = get_sqs_connection(queue_name) 
for sqs_msg in sqs_queue.get_messages(10, wait_time_seconds=5): 
    processed_msg = json.loads(sqs_msg.get_body()) 
    response = pipeline(processed_msg) 
    if response: 
     sqs_queue.delete_message(sqs_msg) 

vous pouvez exécuter ce 2ème processus peut-être dans un python autonome diff fichier, en tant que processus démon ou cron.

J'ai utilisé les carrés Amazon Queue ici, mais il existe différentes options disponibles.

0

Vous disposez d'une ou de deux options pour le faire en un seul processus, mais il y a beaucoup de risques. Si vous lancez un nouveau Thread pour gérer le long processus, vous pourriez finir par déployer ou écraser au milieu et le perdre. Si la durabilité est importante pour vous, jetez un coup d'œil aux agents de tâche de fond comme SQS, Lambda ou même une file d'attente de tâches Celery sauvegardée avec Redis. Une tâche distincte a des modes de défaillance intéressants, et ces outils vous aideront à mieux les gérer que de générer un thread.