2015-08-19 4 views
4

Added a server design Мне нужен веб-сервер, который направляет входящие запросы на работу с базовыми рабочими группами путем их дозирования каждые 0,5 секунды или когда у него есть 50 запросов HTTP в зависимости от того, что произойдет раньше. Что будет хорошим способом реализовать его в python/торнадо или на любом другом языке?Дозирование и очередность на веб-сервере в реальном времени

Я хочу опубликовать входящие запросы в очередь rabbitMQ, а затем как-то объединить их перед отправкой на серверные серверы. Я не могу понять, как выбрать несколько запросов из очереди rabbitMq. Может ли кто-нибудь указать мне в правильном направлении или предложить альтернативный аптайм?

+0

Можете ли вы предоставить больше контекста о том, почему вы хотите сделать это (пакетные запросы Снегурочка), и что бы возможные случаи использования? –

+0

Внутренние серверы - это графические процессоры. Следовательно, можно выполнять параллельную обработку намного быстрее, чем выполнять ее последовательно. – ankit

ответ

1

Я бы предложил использовать простой микро-каркас python, такой как бутылка. Затем вы отправляете запросы в фоновый процесс через очередь (таким образом, чтобы соединение заканчивалось).

Фоновый процесс будет иметь непрерывный цикл, который будет проверять ваши условия (время и число) и выполнять задание после выполнения условия.

Edit:.

Вот пример веб-сервер, что партии детали перед отправкой их в любой системе массового обслуживания вы хотите использовать (RabbitMQ всегда казалось, усложненной ко мне с Python Я использовал сельдерей и другие, более простые системы массового обслуживания, прежде чем). Таким образом, бэкэнд просто захватывает один «элемент» из очереди, который будет содержать все требуемые 50 запросов.

import bottle 
import threading 
import Queue 


app = bottle.Bottle() 

app.queue = Queue.Queue() 


def send_to_rabbitMQ(items): 
    """Custom code to send to rabbitMQ system""" 
    print("50 items gathered, sending to rabbitMQ") 


def batcher(queue): 
    """Background thread that gathers incoming requests""" 
    while True: 
     batcher_loop(queue) 


def batcher_loop(queue): 
    """Loop that will run until it gathers 50 items, 
    then will call then function 'send_to_rabbitMQ'""" 
    count = 0 
    items = [] 
    while count < 50: 
     try: 
      next_item = queue.get(timeout=.5) 
     except Queue.Empty: 
      pass 
     else: 
      items.append(next_item) 
      count += 1 

    send_to_rabbitMQ(items) 


@app.route("/add_request", method=["PUT", "POST"]) 
def add_request(): 
    """Simple bottle request that grabs JSON and puts it in the queue""" 
    request = bottle.request.json['request'] 
    app.queue.put(request) 


if __name__ == '__main__': 
    t = threading.Thread(target=batcher, args=(app.queue,)) 
    t.daemon = True # Make sure the background thread quits when the program ends 
    t.start() 

    bottle.run(app) 

Код, используемый для проверки его:

import requests 
import json 

for i in range(101): 
    req = requests.post("http://localhost:8080/add_request", 
         data=json.dumps({"request": 1}), 
         headers={"Content-type": "application/json"}) 
+0

Спасибо CasualDemon. Я думаю, я не был очень ясен раньше. Я добавил изображение и отредактировал описание, чтобы лучше объяснить мой вопрос. – ankit

+0

@ankit Я обновил свой ответ, чтобы хотя бы дать вам представление о том, как может выглядеть веб-сервер. Надеюсь, это поможет вам в правильном направлении. – CasualDemon

+0

Спасибо @CasualDemon, мне также нужно ответить в браузерах с результатами, когда Back-end завершил обработку. Как это можно достичь? – ankit

Смежные вопросы