Tutorial de paginação
Atualizado
Atualizado
Ao construir um fluxo de integração, você pode precisar processar grandes quantidades de dados. Processar todos esses dados de uma vez pode causar erros, como um erro do tipo timeout ou Out of Memory (OOM). Uma solução para esse problema é a paginação. Usando a paginação, você pode dividir o processo de consulta dos dados em etapas e recuperar somente uma quantidade limitada de registros por vez.
Nos artigos seguintes, vamos lhe guiar acerca de como implementar a paginação em um fluxo que realiza uma migração total de um banco de dados de HR diariamente às 1 da manhã.
Quando você copia componentes na Digibee Integration Platform, eles são armazenados na sua área de transferência como objetos JSON. O objeto JSON que se refere ao pipeline de paginação descrito aqui está disponível no bloco expansível abaixo. Você pode copiá-lo e colá-lo no Canvas e fazer as alterações necessárias para sua implementação.
Antes de implementar a paginação, você deve checar se a API, banco de dados ou web service que você está consultando suporta paginação. Se não, você ainda pode melhorar a performance do seu fluxo de integração aumentando o tamanho da implementação dos seus pipelines.
Neste exemplo, o fluxo de paginação é ativado a cada cinco minutos. Ele começa com uma sequência de passos iniciais. Depois desses passos, o fluxo se divide em três caminhos, como mostrado abaixo:
O fluxo segue o caminho “FINISHED” se o processo de migração de dados já terminou naquele dia ou se ainda não é hora de iniciá-lo.
O fluxo segue o caminho “EXTRACTING_DATA” quando está na hora de iniciar o processo de migração e esse processo ainda não terminou.
O fluxo segue o caminho de erro caso um erro ocorra nos passos iniciais.
Nos artigos seguintes, vamos lhe instruir passo-a-passo sobre como construir cada um desses caminhos.
{ "meta": { "trigger": { "position": { "x": 41, "y": 173 } }, "4ad4a7c5-7072-4722-b9a8-5a0bec9a3ee7": { "position": { "x": 173, "y": 173 } }, "40de968f-3ba5-4040-b549-c2baec47ac9c": { "position": { "x": 305, "y": 173 } }, "6068bb57-2293-485f-8b7f-7521da1f61e6": { "position": { "x": 437, "y": 173 } }, "f3611d47-634c-43b6-af69-92e873c3054e": { "position": { "x": 574, "y": 173 } }, "ecd403a3-ba82-4225-8773-ac149acab6ef": { "position": { "x": 861, "y": 173 } }, "beec81bb-a26e-4313-8796-c489005c901d": { "position": { "x": 998, "y": 173 } }, "1200afd4-cd17-47e4-92e8-d8b9f5e21d8d": { "position": { "x": 1135, "y": 173 } }, "61abe3ae-76f5-4aa9-a0e0-1efac1761de6": { "position": { "x": 1267, "y": 173 } }, "255bfcd8-01da-48a0-b87f-058f27ffcb29": { "position": { "x": 1399, "y": 173 } }, "14bb99b3-a847-4fce-87fc-92b0ee4f75e3": { "position": { "x": 1536, "y": 173 } }, "dc5d99dd-c880-4fd5-8a0f-97113e619606": { "position": { "x": 1915, "y": 239 } }, "a3e438f1-c3cb-47fd-a16f-058c8d452b68": { "position": { "x": 2047, "y": 239 } }, "d1163524-a410-4820-9649-5c43191e78cc": { "position": { "x": 2179, "y": 239 } }, "f236ae9e-8519-4e98-8151-0b011689e981": { "position": { "x": 2311, "y": 239 } }, "fe6a50ad-98c9-4c95-8da0-e1a315ca0596": { "position": { "x": 1915, "y": 107 } }, "247dccab-af16-401f-bc85-385d0a0d7eee": { "position": { "x": 2047, "y": 107 } }, "3d60fe4b-8876-4b28-b22d-0970e328967a": { "position": { "x": 2179, "y": 107 } }, "16735d3e-2e97-4478-be30-7648d0fa33d9": { "position": { "x": 2311, "y": 107 } }, "d789cf6d-7aaf-4adb-b310-d41d1e876b85": { "position": { "x": 861, "y": 414 } }, "b4b32036-a35b-42d7-9aef-146865104d17": { "position": { "x": 998, "y": 414 } }, "422e66af-dc41-4941-b7ce-5dedbc57e9f7": { "position": { "x": 1536, "y": 482.5 } }, "414b3c40-57fd-46d1-b396-09438646a403": { "position": { "x": 1678, "y": 482.5 } }, "2fcc5e50-ab4a-4003-999c-618604ead6a1": { "position": { "x": 2047, "y": 411.5 } }, "77a2dc52-9b57-4dad-b20e-a4ec8c8883d6": { "position": { "x": 2179, "y": 411.5 } }, "83d038fa-ac4d-4eff-ba4c-0a870b16440b": { "position": { "x": 2311, "y": 411.5 } }, "a222d3e6-0c2e-4132-bb50-c4cc94ef9195": { "position": { "x": 2047, "y": 548.5 } }, "ff25540c-01e6-42a4-af81-d89699a7f5d2": { "position": { "x": 2179, "y": 548.5 } }, "b3d89cf2-6d0c-447c-8990-fabc2a7f4ae2": { "position": { "x": 1536, "y": 345.5 } }, "00b06e8d-f5de-47ae-87a6-ade931cac2e6": { "position": { "x": 1678, "y": 345.5 } }, "318cb4a9-d653-4409-ac59-aac54b00b34b": { "position": { "x": 861, "y": 41 } }, "bf4a9f9e-0d6e-4775-a886-e4b321fd846f": { "position": { "x": 998, "y": 41 } } }, "flowSpec": { "disconnected-root:5b10222e-c930-4e9e-b584-04a07c5639b2": [ { "stepName": "obtem parâmetros de paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "FIND", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "limit": "0", "skip": "0", "sort": "{}", "unique": true, "isolated": false, "upsert": false, "failOnError": false }, "id": "4ad4a7c5-7072-4722-b9a8-5a0bec9a3ee7", "type": "connector", "name": "object-store-connector" }, { "stepName": "cria valores padrão", "params": { "json": "{\n "control":{\n "startTimestamp": {{ metadata.execution.startTimestamp }},\n "limit": {{ DEFAULT( message.data[0].limit, 500 ) }},\n "start": {{ DEFAULT( message.data[0].start, 0 ) }},\n "end": {{ DEFAULT( message.data[0].end, 500 ) }},\n "step": {{ DEFAULT( message.data[0].step, "FINISHED" ) }},\n "nextExecutionTimestamp": {{ message.data[0].nextExecutionTimestamp }}\n }\n}", "failOnError": false }, "id": "40de968f-3ba5-4040-b549-c2baec47ac9c", "type": "connector", "name": "json-generator-connector" }, { "type": "session-management", "stepName": "put control", "operation": "PUT", "sessionType": "LOCAL", "scoped": false, "fields": [ "control" ], "id": "6068bb57-2293-485f-8b7f-7521da1f61e6" }, { "stepName": "verifica step", "id": "f3611d47-634c-43b6-af69-92e873c3054e", "type": "choice", "when": [ { "jsonPath": "$.control.[?(@.step == 'EXTRACTING_DATA')]", "target": "EXTRACTING_DATA (1)" }, { "jsonPath": "$.control.[?(@.step == 'FINISHED')]", "target": "FINISHED (1)" } ], "otherwise": "erro - step desconhecido" } ], "EXTRACTING_DATA (1)": [ { "type": "connector", "name": "log-connector", "stepName": "Log - EXTRACTING_DATA", "params": { "logLevel": "INFO", "message": " EXTRACTING_DATA" }, "id": "ecd403a3-ba82-4225-8773-ac149acab6ef" }, { "stepName": "select enb_person", "accountLabel": "mysql-2", "params": { "url": "{{global.enablement-db-url}}", "sql": "select * from enb_person limit {{ message.control.start }}, {{ message.control.limit }}", "itemIdentifier": "codigo", "parallel": false, "blobAsFile": false, "clobAsFile": false, "failOnError": false, "connectionProperties": "{}", "keepConnection": true, "advanced": false, "dbPoolByActualConsumers": false, "exclusiveDbPool": false, "columnFromLabel": false, "connectionTestQuery": "", "onProcess": "beec81bb-a26e-4313-8796-c489005c901d-onProcessTrack", "onException": "beec81bb-a26e-4313-8796-c489005c901d-onExceptionTrack" }, "id": "beec81bb-a26e-4313-8796-c489005c901d", "type": "connector", "name": "stream-db-connector-v3" }, { "stepName": "agrupa resumo", "params": { "json": "{\n "summary": {{ message.$ }}\n}", "failOnError": false }, "id": "1200afd4-cd17-47e4-92e8-d8b9f5e21d8d", "type": "connector", "name": "json-generator-connector" }, { "stepName": "put summary", "operation": "PUT", "sessionType": "LOCAL", "fields": [ "summary" ], "scoped": false, "id": "61abe3ae-76f5-4aa9-a0e0-1efac1761de6", "type": "session-management" }, { "type": "session-management", "stepName": "get control", "operation": "GET", "sessionType": "LOCAL", "scoped": false, "fields": [ "control" ], "id": "255bfcd8-01da-48a0-b87f-058f27ffcb29" }, { "type": "choice", "stepName": "Choice", "when": [ { "jsonPath": "$.[?(@.summary.total < @.control.limit)]", "target": "acabou a paginação" } ], "otherwise": "próxima página", "id": "14bb99b3-a847-4fce-87fc-92b0ee4f75e3" } ], "beec81bb-a26e-4313-8796-c489005c901d-onProcessTrack": [ { "stepName": "publica evento de processamento", "params": { "eventName": "evt-proc-handson-architecture-danilo-loose-t33", "body": "{{ message.$ }}", "showSendEventLog": false, "stopOnError": false }, "id": "164942d0-8d6f-4336-8e44-435a785cc831", "type": "connector", "name": "event-publisher-connector" }, { "stepName": "mensagem de sucesso", "params": { "json": "{\n "success": true\n}", "failOnError": false }, "id": "b084d694-7d97-483f-a7dd-afc19ec123e6", "type": "connector", "name": "json-generator-connector" } ], "beec81bb-a26e-4313-8796-c489005c901d-onExceptionTrack": [ { "stepName": "Log - onException Stream DB", "params": { "logLevel": "ERROR", "message": "onException stream DB" }, "id": "3ef82a05-0abc-4eb3-b274-7db5835ab6f5", "type": "connector", "name": "log-connector" }, { "stepName": "publica evento de erro", "params": { "eventName": "error-event-pagination", "body": "{{ message.$ }}", "showSendEventLog": false, "stopOnError": false }, "id": "66ca7207-57c1-4570-8a46-3481abed9592", "type": "connector", "name": "event-publisher-connector" }, { "type": "connector", "name": "throw-error-connector", "stepName": "Throw Error", "params": { "errorMessage": "Error occurred.", "errorCode": 500, "customErrorEnabled": false, "failOnError": true }, "id": "1051c76e-ef85-46a7-a783-05f03aa12358" } ], "acabou a paginação": [ { "stepName": "Log - acabou a paginação", "params": { "logLevel": "WARN", "message": "acabou a paginação" }, "id": "dc5d99dd-c880-4fd5-8a0f-97113e619606", "type": "connector", "name": "log-connector" }, { "stepName": "atualizar parâmetros da paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "UPDATE", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "document": "{\n $set:{\n "start": 0,\n "end": null,\n "step": "FINISHED",\n "nextExecutionTimestamp": {{ FORMATDATE(FORMATDATE(SUMDATE( NOW() , "DAY", 1), "timestamp", "dd/MM/yyyy 01:00:00"), "dd/MM/yyyy HH:mm:ss", "timestamp") }}\n }\n}", "unique": true, "isolated": false, "upsert": true, "failOnError": false }, "id": "a3e438f1-c3cb-47fd-a16f-058c8d452b68", "type": "connector", "name": "object-store-connector" }, { "operation": "GET", "scoped": false, "sessionType": "LOCAL", "stepName": "get control", "fields": [ "control" ], "type": "session-management", "id": "d1163524-a410-4820-9649-5c43191e78cc" }, { "stepName": "cria output", "params": { "json": "{\r\n "message": {{ CONCAT("Migration will start at ", FORMATDATE( message.control.nextExecutionTimestamp, "timestamp", "dd/MM/yyyy HH:mm:ss")) }}\r\n}\r\n", "failOnError": false }, "id": "f236ae9e-8519-4e98-8151-0b011689e981", "type": "connector", "name": "json-generator-connector" } ], "próxima página": [ { "stepName": "Log - próxima página", "params": { "logLevel": "INFO", "message": "proxima pagina" }, "id": "fe6a50ad-98c9-4c95-8da0-e1a315ca0596", "type": "connector", "name": "log-connector" }, { "stepName": "atualizar parâmetros da paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "UPDATE", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "document": "{\n $set:{\n "start": {{ message.control.end }},\n "end": {{ TOINT(SUM(message.control.end, message.control.limit)) }},\n "step": "EXTRACTING_DATA"\n }\n}", "unique": true, "isolated": false, "upsert": true, "failOnError": false }, "id": "247dccab-af16-401f-bc85-385d0a0d7eee", "type": "connector", "name": "object-store-connector" }, { "stepName": "obter parâmetros da paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "FIND", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "limit": "0", "skip": "0", "sort": "{}", "unique": true, "isolated": false, "upsert": false, "failOnError": false }, "id": "3d60fe4b-8876-4b28-b22d-0970e328967a", "type": "connector", "name": "object-store-connector" }, { "stepName": "cria output", "params": { "json": "{\n "message": "The data is being migrated.",\n "next_execution": {{ message.data[0] }}\n}", "failOnError": false }, "id": "16735d3e-2e97-4478-be30-7648d0fa33d9", "type": "connector", "name": "json-generator-connector" } ], "FINISHED (1)": [ { "stepName": "Log - FINISHED", "params": { "logLevel": "INFO", "message": "FINISHED" }, "id": "d789cf6d-7aaf-4adb-b310-d41d1e876b85", "type": "connector", "name": "log-connector" }, { "type": "choice", "stepName": "Choice", "when": [ { "jsonPath": "$.[?(@.control.nextExecutionTimestamp != null)]", "target": "nextExecutionTimestamp não é null" } ], "otherwise": "nextExecutionTimestamp é null", "id": "b4b32036-a35b-42d7-9aef-146865104d17" } ], "nextExecutionTimestamp não é null": [ { "stepName": "Log - nextExecutionTimestamp não é null", "params": { "logLevel": "INFO", "message": "nextExecution preenchido" }, "id": "422e66af-dc41-4941-b7ce-5dedbc57e9f7", "type": "connector", "name": "log-connector" }, { "type": "choice", "stepName": "Choice", "when": [ { "jsonPath": "$.control.[?(@.startTimestamp>= @.nextExecutionTimestamp)]", "target": "recomeçar migração" } ], "otherwise": "esperar até a próxima migração", "id": "414b3c40-57fd-46d1-b396-09438646a403" } ], "recomeçar migração": [ { "stepName": "Log - recomeçar migração", "params": { "logLevel": "INFO", "message": "recomeçar a migração" }, "id": "2fcc5e50-ab4a-4003-999c-618604ead6a1", "type": "connector", "name": "log-connector" }, { "stepName": "atualizar parâmetros da paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "UPDATE", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "document": "{\n $set:{\n "step": "EXTRACTING_DATA"\n }\n}", "unique": true, "isolated": false, "upsert": true, "failOnError": false }, "id": "77a2dc52-9b57-4dad-b20e-a4ec8c8883d6", "type": "connector", "name": "object-store-connector" }, { "stepName": "cria output", "params": { "json": "{\n "message": "Migration will start at the next execution."\n}", "failOnError": false }, "id": "83d038fa-ac4d-4eff-ba4c-0a870b16440b", "type": "connector", "name": "json-generator-connector" } ], "esperar até a próxima migração": [ { "stepName": "Log - esperar até a próxima migração", "params": { "logLevel": "INFO", "message": "esperar" }, "id": "a222d3e6-0c2e-4132-bb50-c4cc94ef9195", "type": "connector", "name": "log-connector" }, { "stepName": "cria output", "params": { "json": "{\n "mensagem": {{ CONCAT("Migration will begin at ", FORMATDATE( message.control.nextExecutionTimestamp, "timestamp", "dd/MM/yyyy HH:mm:ss")) }}\n}", "failOnError": false }, "id": "ff25540c-01e6-42a4-af81-d89699a7f5d2", "type": "connector", "name": "json-generator-connector" } ], "nextExecutionTimestamp é null": [ { "stepName": "Log - nextExecutionTimestamp é null", "params": { "logLevel": "WARN", "message": "nextExecution nulo" }, "id": "b3d89cf2-6d0c-447c-8990-fabc2a7f4ae2", "type": "connector", "name": "log-connector" }, { "stepName": "atualiza parâmetros de paginação", "accountLabel": "dgb-internal-object-store-account", "params": { "operation": "UPDATE", "objectStore": "pagination-OS-example", "objectId": "{{ CONCAT(metadata.pipeline.name, "_v" , metadata.pipeline.versionMajor) }}", "document": "{\n $set:{\n "nextExecutionTimestamp": {{ FORMATDATE(FORMATDATE(SUMDATE( NOW() , "DAY", 1), "timestamp", "dd/MM/yyyy 01:00:00"), "dd/MM/yyyy HH:mm:ss", "timestamp") }}\n }\n}", "unique": true, "isolated": false, "upsert": true, "failOnError": false }, "id": "00b06e8d-f5de-47ae-87a6-ade931cac2e6", "type": "connector", "name": "object-store-connector" } ], "erro - step desconhecido": [ { "stepName": "Log - erro step desconhecido", "params": { "logLevel": "ERROR", "message": "Error processing message {{ message.$.myField }}" }, "id": "318cb4a9-d653-4409-ac59-aac54b00b34b", "type": "connector", "name": "log-connector" }, { "type": "connector", "name": "throw-error-connector", "stepName": "Throw Error", "params": { "errorMessage": "Error occurred.", "errorCode": 500, "customErrorEnabled": false, "failOnError": true }, "id": "bf4a9f9e-0d6e-4775-a886-e4b321fd846f" } ] } }