Асинхронные сторонние таблицы, внешняя оболочка данных

Я работаю над внешними оболочками данных в postgres, используя multicorn и триггеры для вставки данных в сторонние таблицы, однако я не хочу, чтобы postgres ждал ответа после триггера, просто триггер вставляет его, а затем забывает. как это возможно.

На самом деле я использую его для чужой таблицы

CREATE FOREIGN TABLE media_es (
    id BIGINT,
    title TEXT,
    description TEXT,
    tags TEXT,
    query TEXT,
    score NUMERIC
  )
  SERVER multicorn_es
  OPTIONS (
      host 'elasticsearch',  
      port '9200',
      index 'test',
      type 'media',
      rowid_column 'id',
      query_column 'query',
      score_column 'score'
  );


CREATE TRIGGER es_insert_media
      AFTER INSERT
          ON media
      FOR EACH ROW
          EXECUTE PROCEDURE index_media();

CREATE OR REPLACE FUNCTION index_media()
      RETURNS trigger
      AS $def$
          BEGIN
          INSERT INTO media_es
                (
                  id,
                  title,
                  description,
                  tags
              )
          VALUES
              (
                  NEW.id,
                  NEW.title,
                  NEW.description,
                  NEW.tags
              )
          ;
          RETURN NEW;  
      END;
  $def$ LANGUAGE plpgsql;

person Zubair Nabi    schedule 07.06.2017    source источник
comment
@VaoTsun Я использую триггер в postgres и не хочу никакого ответа от триггера. Скорее используйте асинхронные вызовы триггера. Просто вызовите триггер и забудьте об этом.   -  person Zubair Nabi    schedule 07.06.2017
comment
Я не получаю никакого ответа от триггера. Это нормально. Но он все еще ждет завершения выполнения. Я не хочу этого даже ждать. @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017
comment
Да. Правильно @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017
comment
Вы сказали, не ждите, пока это закончится, как это возможно. Можете ли вы уточнить немного. @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017
comment
Конечно. Редактирование моего поста   -  person Zubair Nabi    schedule 07.06.2017
comment
@VaoTsun Отредактировано   -  person Zubair Nabi    schedule 07.06.2017
comment
ага - теперь я понимаю вашу проблему с асинхронностью, я думаю. вместо этого используйте dblink для вставки, а не fdw   -  person Vao Tsun    schedule 07.06.2017
comment
FDW используется намеренно из-за его производительности и сохранения соединения. @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017
comment
@VaoTsun есть ли способ использовать FDW   -  person Zubair Nabi    schedule 07.06.2017
comment
Не знаю. Я использовал dblink для асинхронных операций. не уверен, что для этого есть какой-нибудь другой лайфхак   -  person Vao Tsun    schedule 07.06.2017
comment
будет ли здесь тренироваться фреймворк Notify/Listen? @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017
comment
с некоторым уровнем извращения. но речь пойдет и не о FDW - вставка будет выполняться не функцией триггера, а другим кодом - так же, как если бы вы поместили вставку dblink внутри своей триггерной функции - так что я не вижу, чем она отличается   -  person Vao Tsun    schedule 07.06.2017
comment
вся идея состоит в том, чтобы поместить perform async_call(NEW); ВМЕСТО фактической вставки для запуска функции. а как вы реализуете async_call - это совсем другой вопрос   -  person Vao Tsun    schedule 07.06.2017
comment
Ok. Спасибо . @VaoTsun   -  person Zubair Nabi    schedule 07.06.2017


Ответы (1)


Расширение postgres dblink позволяет выполнять асинхронные вызовы на удаленный сервер через dblink-send-query.

не уверен, как это будет работать в триггере с точки зрения установления нескольких соединений. здесь следует соблюдать осторожность для утечки ресурсов

person Ameba Brain    schedule 13.09.2019