TNonblockingServerTransport не реализован в библиотеке Thrift C # - PullRequest
0 голосов
/ 01 июня 2019

При использовании Apache Thrift [https://github.com/apache/thrift] для создания неблокирующего сервера в C # следующие классы / типы не могут быть распознаны:

TNonblockingServerTransport
TNonblockingServer

Я хочу отправить команду с моего ноутбука win10, чтобы контролировать трудоемкие вычисления, выполняемые на высокопроизводительном сервере (Ubuntu). Вот почему я пришел в Apache Thrift. Я нашел официальный учебник по версии C # [https://github.com/apache/thrift/tree/master/tutorial/csharp], и он хорошо работает В этом руководстве используется так называемый режим блокировки (TSimpleServer). Но в моей ситуации трудоемкая процедура расчета должна прерываться. Следовательно, я должен использовать неблокирующий сервер.

Логика проста. Для сервера я использовал закрытый флаг forceStop . Если клиент вызовет Stop (), forceStop будет установлен в значение true, и цикл вычисления прекратится.

        // #Server#
        // Server Set-Up
        private void SetUp()
        {
         try
            {
                CalculatorHandler handler = new CalculatorHandler();
                Calculator.Processor processor = new 
                Calculator.Processor(handler);
                var serverTransport = new TServerSocket(9090);
                TServer server = new TSimpleServer(processor, serverTransport);

                // Use this for a multithreaded server
                // server = new TThreadPoolServer(processor, serverTransport);

                Console.WriteLine("Starting the server...");
                server.Serve();
            }
            catch (Exception x)
            {
                Console.WriteLine(x.StackTrace);
            }
        }

        private bool forceStop;
        public int TimeConsumingOperation(int n1, int n2)
        {
            Console.WriteLine("add({0},{1})", n1, n2);
            for (int i = 0; i < 10; i++)
            {
                //calculating
                Thread.Sleep(500);

                if (forceStop)
                {
                    Quit();
                }
            }
            return n1 + n2;
        }

        public void Stop()
        {
            forceStop = true;
        }
// Client

// Button#1 Click callback
private void Button_Start_Click()
{
    client.TimeConsumingOperation(0,0);
}

// Button#2 Click callback
private void Button_Stop_Click()
{
    client.Stop();
}
//

Я нашел несколько полезных примеров в java [https://chamibuddhika.wordpress.com/2011/10/02/apache-thrift-quickstart-tutorial/].. Я изо всех сил стараюсь преобразовать Java-код неблокированного сервера в соответствующий код C #, но обнаружил, что TNonblockingServerTransport, похоже, отсутствует. в C #. Кто-нибудь может мне помочь с этой проблемой?

// Java Code
public class NonblockingServer {

    private void start() {
        try {
            TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(7911);
            ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());

            TServer server = new TNonblockingServer(new TNonblockingServer.Args(serverTransport).
                    processor(processor));
            System.out.println("Starting server on port 7911 ...");
            server.serve();
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        NonblockingServer srv = new NonblockingServer();
        srv.start();
    }
}

1 Ответ

1 голос
/ 01 июня 2019

На самом деле есть два ответа на этот вопрос.

Возможная реализация

Ваша настройка, для начала, несовершенна.

    // #Server#
    // Server Set-Up

    private bool forceStop;

    public void Stop()
    {
        forceStop = true;
    }

Предположим, у нас есть два клиентаоба начинают новый расчет.Теперь один клиент хочет прервать.Что происходит?

Решение состоит в том, чтобы структурировать его таким образом, чтобы вычисление представляло собой отдельный объект бизнес-логики, экземпляр которого создается на TimeConsumingOperation() и предоставляется клиенту некоторыми средствами, обычно путем возврата некоторого видаID.

Когда клиент теперь хочет прервать, он вызывает Stop(calcualtionID).Логика на стороне сервера теперь направляет вызов к реализации и запускает любой механизм прерывания, с C # это, вероятно, CancellationToken.

Третий вызов потребуется для запроса окончательных результатов с сервера.закончить, как только расчет закончен.Обратите внимание, что мы все еще работаем с TSimpleServer, и причина в том, что он работает, потому что мы избегаем блокировки вызовов с помощью API.

Неблокирующий сервер

Да, реализации пока нетC #.Поскольку Thrift является Open Source, это, вероятно, просто означает, что до сих пор никто не сталкивался с этим вариантом использования и хотел тратить время на реализацию.Это не означает, что такой вариант использования может не существовать.

Существуют

  • Многопоточные и Threadpool серверы
  • Task.Run(() => { your code })

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

Итог

Существуют определенные способы обойти это ограничениеВы испытали.Еще одна альтернатива может заключаться в том, чтобы стать участником , перенеся одну из существующих (например, Java) неблокирующих реализаций на NetStd (предпочтительно, поскольку C # и NetCore перейдут в состояние "устарело" сследующий выпуск и оба будут заменены NetStd)

...