Запись и обработка Twitter Streaming API с использованием Windows Azure и F#
Месяц назад я пытался использовать агенты F# для обработки и записи данных Twitter StreamingAPI здесь. В качестве небольшого упражнения я пытаюсь перенести код в Windows Azure.
Пока у меня две роли:
Одна рабочая роль (издатель), которая помещает сообщения (сообщение, являющееся json твита) в очередь.
Одна рабочая роль (Процессор), которая читает сообщения из очереди, декодирует JSON и сбрасывает данные в облачную таблицу.
Что приводит к множеству вопросов:
- Можно ли думать о рабочей роли как агента?
- На практике сообщение может быть больше 8 КБ, поэтому мне нужно использовать хранилище больших двоичных объектов и передать в качестве сообщения ссылку на большой двоичный объект (или есть ли другой способ?), Это повлияет на производительность?
- Правильно ли говорить, что при необходимости я могу увеличить количество экземпляров рабочей роли Процессор, и очередь будет волшебным образом обрабатываться быстрее?
Извините, что загоняю все эти вопросы, надеюсь, вы не против
Большое спасибо!
3 ответа
Можно ли думать о рабочей роли как агента?
Определенно да.
На практике сообщение может быть больше 8 КБ, поэтому мне нужно использовать хранилище больших двоичных объектов и передать в качестве сообщения ссылку на большой двоичный объект (или есть ли другой способ?), Это повлияет на производительность?
Да, использование техники, о которой вы говорите (сохранение JSON в хранилище больших двоичных объектов с именем "JSONMessage-1" и последующая отправка сообщения в очередь с содержимым "JSONMessage-1"), кажется стандартным способом передача сообщений в Azure размером более 8 КБ. Поскольку вы делаете 4 вызова в хранилище Azure, а не 2 (1 для получения сообщения очереди, 1 для получения содержимого большого двоичного объекта, 1 для удаления из очереди, 1 для удаления большого двоичного объекта), это будет медленнее. Будет ли это заметно медленнее? Возможно нет. Если при кодировании Base64 большое количество сообщений будет меньше 8 КБ (это недочёт в библиотеке StorageClient), вы можете добавить некоторую логику, чтобы определить, как его отправлять.
Правильно ли говорить, что при необходимости я могу увеличить количество экземпляров рабочей роли Процессор, и очередь будет волшебным образом обрабатываться быстрее?
Если вы написали свою рабочую роль так, чтобы она была автономной, а экземпляры не попадали друг в друга, то да, увеличение количества экземпляров увеличит сквозной путь. Если ваша роль состоит в основном в чтении и записи в хранилище, вы можете сначала получить многопоточность рабочей роли, прежде чем увеличивать количество экземпляров, что сэкономит деньги.
Существует библиотека с открытым исходным кодом Lokad.Cloud, которая может прозрачно обрабатывать большие сообщения, вы можете проверить это на http://code.google.com/p/lokad-cloud/
Можно ли думать о рабочей роли как агента?
Это идеальный способ думать об этом. Представьте себе рабочих в Макдональдсе. У каждого работника есть определенные задачи, и они общаются друг с другом с помощью сообщений (разговорных).
На практике сообщение может быть больше 8 КБ, поэтому мне нужно использовать хранилище больших двоичных объектов и передать в качестве сообщения ссылку на большой двоичный объект (или есть ли другой способ?), Это повлияет на производительность?
Пока сообщение является неизменным, это лучший способ сделать это. Строки могут быть очень большими и поэтому размещаются в куче. Поскольку они неизменны, передача ссылок не является проблемой.
Правильно ли говорить, что при необходимости я могу увеличить количество экземпляров рабочей роли Процессор, и очередь будет волшебным образом обрабатываться быстрее?
Вам нужно посмотреть, что делает ваш процесс, и решить, связан ли он с IO или с CPU. Обычно процессы, связанные с вводом-выводом, будут иметь увеличение производительности за счет добавления большего числа агентов. Если вы используете ThreadPool
для ваших агентов работа будет хорошо сбалансирована даже для процессов, связанных с процессором, но вы достигнете предела. При этом не бойтесь возиться с вашей архитектурой и ИЗМЕРЯЙТЕ результаты каждого прогона. Это лучший способ сбалансировать количество используемых агентов.