Предложения библиотеки С++ для RPC

Я ищу предложения относительно библиотек RPC, реализованных на С++, для разработчиков на С++.

Некоторые ограничения требований:

  • Должно работать как с системами linux/unix, так и с win32.
  • Уметь выполнять бесплатные функции и методы класса
  • Надеюсь, написанный на современном С++ не 90-е/java-esque С++
  • Уметь работать через сети и hetrogenous архитектуры.
  • Не слишком медленный или неэффективный
  • Мы надеемся предоставить интерфейсы для стиля TR1 std:: function и др.

Мой пример использования - вызывать свободную функцию foo на удаленной машине.

---snip---
// foo translation unit
int foo(int i, int j)
{
   return i + j;
}
---snip---


---snip---
// client side main
int main()
{
   //register foo on client and server
   //setup necassary connections and states

   int result;

   if (RPCmechanism.invoke("foo",4,9,result))
      std::cout << "foo(4,9) = " result << std::endl;
   else
      std::cout << "failed to invoke foo(4,9)!" << std::endl;

   return 0;
}
---snip---

Что-то, что может достичь вышеупомянутого или подобного, было бы здорово.

Примечание. Я НЕ заинтересован в других языковых привязках. Пожалуйста, не предлагайте решение, потому что оно имеет другие языковые привязки. Меня интересуют только хорошо разработанные RPC-фреймворки, написанные на С++ для языка С++, которые эффективны и подходят для сценариев HPC.

Ответы

Ответ 1

Это довольно набор требований...

Пока они не встречаются со всеми (поскольку я не уверен, что такой зверь существует, я рекомендую вашему вниманию ICE от ZeroC. Разработанный частично Мичи Хеннинг из славы CORBA (и спросите своих друзей в телекоммуникационном секторе, это действительно не грязное слово), ICE - это то, что CORBA выглядело бы, если бы оно началось позже и не было разработано комитетом.

Их С++-отображение - это все, что CORBA нет, оно использует типы STL и, как правило, более новое ощущение.

Он терпит неудачу в тестах free-function и std:: function, но, учитывая невероятность поиска продукта для всего этого списка, это делает хорошую работу для многих остальных.

Удача

Ответ 2

Я также заинтересован в жизнеспособных реализациях С++ RPC. После некоторых исследований я обнаружил, что протоколы травления, бережливости и протоколов являются наиболее перспективными решениями, однако ни один из них не отвечает всем моим потребностям. Мои критерии поиска:

  • многоязычный, с С++ и PHP как обязательный (С#, Java, Python, Perl не так важно сейчас)
  • сервер может компилироваться/запускаться только в Linux (с Windows как долгосрочная цель)
  • клиент должен работать в Windows и Linux (и, возможно, Mac)
  • с открытым исходным кодом и коммерчески доступным (то есть без GPL)
  • он должен поддерживать шифрование из коробки

И кандидаты:

  • Apache Etch

    Плюсы:

    • Связывание C основано на APR
    • поддерживает шифрование
    • работает на обеих платформах

    против

    • медленное развитие
    • отсутствует привязка к PHP
  • Apache Thrift

    Плюсы:

    • маленький
    • привязки нескольких языков

    Минусы:

    • в настоящее время он не поддерживает шифрование (при разработке, по крайней мере, для привязки С++)
    • в Windows, для этого требуется Cygwin
  • Буферы протокола с собственным разработанным RPC-решением

    Плюсы:

    • маленький
    • привязки нескольких языков

    Минусы:

    • нет встроенного RPC

В настоящее время я оцениваю возможность разработки уровня RPC для Protobuf с использованием APR.

Однако поиск продолжается...

EDIT: Мне удалось решить некоторые из этих проблем, используя Apache Qpid (версия С++) с protobuf для сериализации, хотя в настоящее время он не имеет некоторых функций, которые мне нужны.

Ответ 3

старые, такие как DCE-RPC, CORBA,

или Буферы протокола или Thrift, Etch,

или веб-сайты, такие как SOAP или REST.

Какой из них вы хотите, зависит от того, что вы хотите сделать. например. быстрый и эффективный RPC для локальной сети потребует легких бинарных RPC-подобных протокольных буферов, но RPC для гетерогенных веб-сервисов потребует гораздо более подробного SOAP.

Google использует PB для всех своих внутренних RPC, поэтому это хороший выбор. Facebook использует Thrift, поэтому его вряд ли маленький игрок, и MS любит SOAP.

Ответ 7

вы можете использовать protobuf реализовать один самостоятельно, и добавить все, что вы хотели featrue. Это не слишком сложно, и вы можете извлечь из этого много пользы.

Ответ 8

Следующий код, извлеченный из примера клиента TAO CORBA, показывает, что для подключения к серверу требуются 3 строки кода и одна строка кода для вызова функции. Обратите внимание, что вызов функции выглядит как вызов локальной локальной функции. Это может быть либо свободная функция, либо функция-член.

// Bring in the IOR
Object_var factory_object =  orb->string_to_object (argv[1]);

// Now downcast the object reference 
My_Factory_var factory = My_Factory::_narrow (factory_object.in ());

// Now get the full name and price of the other arguments:
Widget_var widget = factory->get_widget (argv[i]);

// Get its name, put it on a _var so it is automatically
// released!
String_var full_name = widget->full_name ();

// Now get the price
Double price = widget->price ();

cout << "The price of a widget in \""
  << full_name.in () << "\" is $"
  << price << endl;

Код сервера немного сложнее показать, но в CORBA, для чего вы хотите сделать, в основном, вы создаете интерфейс IDL, запускаете его через компилятор, а затем заполняете свою логику приложения в соответствующем слоте в заглушке. Итак, ваш основной код выглядит следующим образом:

// First initialize the ORB, that will remove some arguments...
ORB_var orb = ORB_init(argc, argv, "ORB" /* the ORB name, it can be anything! */);
Object_var poa_object = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_object.in());
PortableServer::POAManager_var poa_manager = poa->the_POAManager();
poa_manager->activate();

// Create the servant
My_Factory_i my_factory_i;

// Activate it to obtain the object reference
My_Factory_var my_factory = my_factory_i._this();

// Put the object reference as an IOR string
String_var ior = orb->object_to_string (my_factory.in());
orb->run();

    // Now in your stub file generated by the idl compiler, 
    char * Widget_i::full_name (

  )
  ACE_THROW_SPEC ((
    ::CORBA::SystemException
  ))
{
  return "Some widget name";
}

::CORBA::Double Widget_i::price (

  )
  ACE_THROW_SPEC ((
    ::CORBA::SystemException
  ))
{
  return 1.25;
}

Посмотрите Этот WikiBook для получения дополнительных ссылок и примеров