2021-01-08 11:01:11
#news #cloud
Running large-scale C++ workloads with Cloud Pub/Sub and GKE
Последние пару лет ребята из конмады Google Cloud работали над тем, чтобы сделать Google Cloud отличной платформой для выполнения рабочих нагрузок C ++.
внезапно И вот, что ребята пишут:
Чтобы продемонстрировать некоторый прогресс, которого мы достигли до сих пор, мы покажем, как вы можете использовать
C ++ как с
Cloud Pub / Sub, так и с облачным хранилищем для создания высоко масштабируемой очереди заданий, работающей на Google Kubernetes Engine (GKE).
Sample application
В нашем примере мы создадим миллионы объектов
Cloud Storage; это моделирует параллельное приложение, которое выполняет некоторые вычисления (например, анализирует часть некоторого большого набора данных) и сохраняет результаты в отдельных объектах облачного хранилища.
Мы считаем, что эту рабочую нагрузку легче понять, чем какое-то экзотическое моделирование, но она не является чисто искусственной:
время от времени нашей команде необходимо создавать большие синтетические наборы данных для нагрузочного тестирования.
Основная идея состоит в том, чтобы разбить работу на небольшое количество рабочих элементов, например,
«создать 1000 объектов с этим префиксом».
Ребята привели пример:
Posting the work itemsstruct work_item {
std::string task_id;
std::string bucket;
std::int64_t object_count;
bool use_hash_prefix;
};
Converting this struct to a Pub/Sub message takes only a few lines of code:
pubsub::Message format_work_item(work_item wi) {
return pubsub::MessageBuilder()
.SetAttributes({
{"task_id", std::move(wi.task_id)},
{"bucket", std::move(wi.bucket)},
{"object_count", std::to_string(wi.object_count)},
{"use_hash_prefix", wi.object_count ? "true" : "false"},
})
.Build();
}
Поскольку сообщения публикуются с помощью Publisher, нет необходимости отправлять сообщения в пакетном режиме или повторять их, библиотека заботится об этих деталях:void schedule(...) {
// … … … more details in the GitHub repository … ...
auto const topic = pubsub::Topic(project_id, topic_id);
auto publisher = pubsub::Publisher(pubsub::MakePublisherConnection(topic, {}));
Reading the work itemsЧтобы прочитать рабочие элементы, создайте
Subscriber и свяжите с ним callback. Мы настраиваем подписку на чтение только нескольких сообщений за раз, так как мы предпочитаем хранить сообщения в службе
Pub / Sub до тех пор, пока приложение не будет готово обработать сообщение.
void worker(boost::program_options::variables_map const& vm) {
// … … … more details in the GitHub repository … …
auto const subscription = pubsub::Subscription(project_id, subscription_id);
auto subscriber = pubsub::Subscriber(pubsub::MakeSubscriberConnection(
subscription,
pubsub::SubscriberOptions{}
.set_max_outstanding_messages(concurrency)));
Если приложение, в котором выполняется эта функция, дает сбой или его необходимо перенести с помощью
GKE, служба
Pub / Sub что-то будет делать) а вот что, это остается на домашнее изучение Использование
Pub / Sub в качестве рабочей очереди может упростить реализацию параллельных приложений
C ++.
Pub / Sub распределяет рабочие элементы по приложениям, повторяет их, когда рабочий узел неожиданно завершает свою работу,
и / или масштабируется по мере увеличения количества рабочих узлов.
Если в вашем приложении C ++ много мелких рабочих элементов, и их можно сделать идемпотентными, рассмотрите возможность использования
Pub / Sub и
GKE для планирования задач.
Самое важное:
The code for this example is available in this GitHub repository.
142 viewsgdg_news_bot, 08:01