Actualización en tiempo real

Actualizaciones en tiempo real

Las RTU están destinadas principalmente a actualizaciones que no puedes prever, como cierres por emergencia o metadatos que cambian periódicamente (como las horas de llegada estimadas). Si no es necesario que el cambio se refleje de inmediato, puedes utilizar la transferencia de feed por lotes. Las actualizaciones en tiempo real se procesan en no más de cinco minutos.

Configuración de Google Cloud Platform

  1. Configurar un proyecto de GCP Se necesita un proyecto de GCP para acceder a la API de RTU.
    • Otorga acceso de editor a food-support@google.com
    • Informa a tu PDC de Google el número del proyecto de GCP.Tu proyecto de GCP debe estar asociado a tu cuenta de Actions Center para que las actualizaciones en tiempo real funcionen.
    • Habilita la API de Maps Booking:
      • En GCP, dirígete a APIs y Servicios > Biblioteca.
      • Busca “API de Google Maps Booking”.
        Ubica las APIs de Google Maps Booking
      • Busca la instancia de la zona de pruebas (“API de Google Maps Booking [Dev]) y haz clic en Habilitar.
      • Busca la instancia de producción (“API de Google Maps Booking”) y haz clic en Habilitar.
        Habilitar la API de Google Maps Booking
      • Crear una cuenta de servicio con un rol de editor para tu proyecto de GCP Para obtener más detalles, consulta Configuración de la cuenta de servicio.
      • Asegúrate de subir feeds por lotes al entorno en el que estés trabajando en las actualizaciones en tiempo real.
      • Para la autenticación de la API, te recomendamos instalar la biblioteca cliente de Google en el lenguaje que elijas. Utiliza "https://www.googleapis.com/auth/mapsbooking" como alcance de OAuth. En las muestras de código que se incluyen a continuación, se usan estas bibliotecas. De lo contrario, tendrás que gestionar los intercambios de tokens manualmente tal como se describe en Cómo usar OAuth 2.0 para acceder a las APIs de Google.

Configuración de la cuenta de servicio

Necesitas una cuenta de servicio para realizar solicitudes HTTPS autenticadas a las APIs de Google, como la API de actualizaciones en tiempo real.

Para configurar una cuenta de servicio, haz lo siguiente:

  1. Accede a la consola de Google Cloud Platform.
  2. Tu cuenta del Centro de Acciones también tiene un proyecto de Google Cloud asociado. Selecciona ese proyecto si aún no está seleccionado.
  3. Haz clic en Cuentas de servicio en el menú de la izquierda.
  4. Haz clic en Crear cuenta de servicio.
  5. Ingresa un nombre para la cuenta de servicio y haz clic en Crear.
  6. En Selecciona un rol, elige Proyecto > Editor
  7. Haz clic en Continuar.
  8. Opcional: Agrega usuarios para otorgarles acceso a la cuenta de servicio y haz clic en Listo.
  9. Haz clic en más > Crea una clave para la cuenta de servicio que acabas de crear.
  10. Selecciona JSON como el formato y haz clic en Crear.
  11. Después de que se genere el nuevo par de claves pública/privada, descárgalo en tu equipo.

Trabajar con la API

La API de actualizaciones en tiempo real admite dos tipos de operaciones: Update y Delete. No se pueden agregar entidades nuevas a través de la API de actualización en tiempo real. Las actualizaciones en tiempo real se pueden agrupar si incluyes varias actualizaciones en una sola solicitud a la API. Puedes agrupar hasta 1,000 actualizaciones en una sola llamada a la API. Recomendamos utilizar un enfoque basado en activadores para enviar actualizaciones a través de RTU (es decir, cuando un cambio en los datos de tu sistema active una actualización en tiempo real para Google) en lugar de un enfoque basado en la frecuencia (es decir, cada X minutos analiza tu sistema en busca de cambios) si es posible.

La API de actualizaciones en tiempo real funciona tanto en entornos de zona de pruebas como de producción. El entorno de zona de pruebas se usa para probar las solicitudes a la API y el entorno de producción para actualizar el contenido visible para los usuarios de pedidos de extremo a extremo.

  • Zona de pruebas: partnerdev-mapsbooking.googleapis.com
  • Producción: mapsbooking.googleapis.com

Extremos

La API de actualizaciones en tiempo real expone dos extremos para controlar las solicitudes entrantes de actualizaciones de inventario:

  • ACTUALIZACIÓN: /v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
  • BORRAR - /v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete

El parámetro PARTNER_ID se puede encontrar en el Centro de acciones de la página Cuenta y usuarios, como se muestra en la captura de pantalla a continuación.

ID del socio en el portal de Partners

Tomando 10000001 como el valor de PARTNER_ID como ejemplo de la captura de pantalla anterior, las URL completas para enviar solicitudes de API en la zona de pruebas y producción se verán en los siguientes ejemplos.

Actualización de la zona de pruebas

https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush

BORRAR LA Zona de pruebas

https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete

Actualización de producción

https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush

BORRADO DE Producción

https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete

Actualiza entidades

Para actualizar entidades en tu inventario, usa el extremo update en una solicitud HTTP POST. Cada solicitud POST debe incluir el parámetro 10000001 junto con una carga útil de JSON que contenga la entidad que deseas actualizar.

Nota: Asegúrate de que tus feeds de datos diarios también contengan los cambios enviados a través de la API de actualizaciones en tiempo real. De lo contrario, es posible que tus datos estén desactualizados o inactivos.

Carga útil de la solicitud de actualización

El cuerpo de la solicitud es un objeto JSON con una lista de registros. Cada registro corresponde a una entidad que se está actualizando. Consta del campo proto_record y el generation_timestamp que indica la hora de la actualización de la entidad:

  {
    "records": [
      {
        "proto_record":"ServiceData PROTO",
        "generation_timestamp":"UPDATE_TIMESTAMP"
      }
    ]
  }
  • ServiceData PROTO: Es la traducción proto o JSON de la entidad ServiceData que estás actualizando.
  • UPDATE_TIMESTAMP: Asegúrate de incluir la marca de tiempo del momento en que la entidad se generó en tus sistemas de backend. Si no se incluye este campo, se establecerá en el momento en que Google reciba la solicitud. Cuando se actualiza una entidad a través de una solicitud batchPush, se usa el campo generation_timestamp para el control de versiones de la entidad. Consulta el formato esperado de los valores de tiempo en el esquema del inventario relacional.
  • El cuerpo de la carga útil no debe superar los 5 MB de tamaño.
  • Quita los espacios en blanco para reducir el tamaño.
  • Puede haber hasta 1,000 actualizaciones en una solicitud batchPush.

Ejemplos

Cómo actualizar una hora de llegada estimada

Supongamos que necesitas actualizar con urgencia la hora de llegada estimada de un servicio de entrega de 30 a 60 a 60 a 90 minutos. Tu actualización debe contener el JSON para toda la entidad del servicio.

Considera una entidad de servicio que se vea de la siguiente manera:

{
	"service": {
		"service_id": "service/entity002",
		"service_type": "DELIVERY",
		"parent_entity_id": "entity002",
		"lead_time": {
			"min_lead_time_duration": "600s",
			"max_lead_time_duration": "1800s"
		},
		"action_link_id": "delivery_link/entity002"
	}
}

La actualización en tiempo real por HTTP POST es la siguiente (los cuerpos de las solicitudes están impresos para facilitar la lectura):

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery",
        "service_type" : "DELIVERY",
        "parent_entity_id" : "23456",
        "disabled" : "false",
        "action_link_id": "delivery_link/entity002",
        "lead_time" : {
          "min_lead_time_duration" : {
            "seconds": "3600"
          },
          "max_lead_time_duration" : {
            "seconds": "5400"
          }
        }
      }
    },
    "generation_timestamp": "2023-09-13T17:11:10.750Z"
  }]
}

Actualizar varias entidades

Para actualizar varias entidades de restaurantes en una sola llamada a la API, incluye varios registros en el campo proto_record del cuerpo de la solicitud.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery",
        "service_type" : "DELIVERY",
        "parent_entity_id" : "23456",
        "disabled" : "false",
        "action_link_id": "delivery_link/entity002",
        "lead_time" : {
          "min_lead_time_duration" : {
            "seconds": "1800"
          },
          "max_lead_time_duration" : {
            "seconds": "3600"
          }
        }
      }
    },
    "generation_timestamp": "2023-09-13T17:11:10.750Z"
  },
  {
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "fee" : {
        "fee_id" : "12345/delivery_fee",
        "fee_type" : "DELIVERY",
        "fixed_amount" : {
          "currency_code" : "USD",
          "units" : "10",
          "nanos" : "0"
        },
        "service_ids": ["service/entity002"]
      }
    },
    "generation_timestamp" : "2023-09-13T17:11:10.750Z"
  }]
}

Borrar entidades

Para borrar entidades de tu inventario, usa el extremo DELETE en una solicitud HTTP POST. Cada solicitud POST debe incluir el parámetro PARTNER_ID junto con la carga útil de JSON que contiene el identificador de la entidad que deseas borrar.

Nota: Asegúrate de que tus feeds de datos diarios también contengan los cambios enviados a través de la API de actualizaciones en tiempo real. De lo contrario, la transferencia diaria por lotes reemplazará tus cambios en tiempo real.

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery"
      }
    },
    "delete_time": "2023-09-13T17:11:10.750Z"
  },
  {
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "fee" : {
        "fee_id" : "12345/delivery_fee"
     }
  },
  "delete_time" : "2023-09-13T17:11:10.750Z"
  }]
}

Agrega entidades

No uses actualizaciones en tiempo real para agregar entidades nuevas, ya que esto puede generar incoherencias en los datos. En su lugar, usa feeds por lotes.

Validación y Códigos de respuesta de la API

Hay dos tipos de validaciones que se realizan en las llamadas a la API de actualización en tiempo real:

  • Nivel de solicitud: Estas validaciones comprueban que la carga útil siga el esquema y que cada proto_record contenga los campos id y type. Estas verificaciones son síncronas y los resultados se muestran en el cuerpo de la respuesta de la API. Un código de respuesta 200 y un cuerpo JSON vacío {} significa que estas validaciones se aprobaron y que las entidades de esa solicitud se pusieron en cola para su procesamiento. Un código de respuesta diferente al 200 significa que una o más de estas validaciones fallaron y que se rechazó toda la solicitud (incluidas todas las entidades de la carga útil). Por ejemplo, si a proto_record le falta una @type, se muestra la siguiente respuesta de error:
  {
      "error": {
        "code": 400,
    "message": "Record:{...}",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "[ORIGINAL ERROR] generic::invalid_argument: Failed to parse one or more rtu records. Record:... The entity type could not be extracted from the entity value." 
      }
    ]
  }
  • Nivel de entidad: Cada entidad (proto_record) en la carga útil se valida según el esquema. Los problemas que se encuentran en esta fase de validación no se informan en la respuesta de la API. Solo se registran en el panel de informes de RTU del Centro de acciones.

Nota: Un código de respuesta 200 no significa que todas las entidades se transfirieron de forma correcta.

Cuotas de la API

Las actualizaciones de API en tiempo real tienen una cuota de 1,500 solicitudes cada 60 segundos, o un promedio de 25 solicitudes por segundo. Cuando se supera una cuota, Google responde con el siguiente mensaje de error:

{
  "error": {
    "code": 429,
    "message": "Insufficient tokens for quota ...",
    "status": "RESOURCE_EXHAUSTED",
    "details": [...]
  }
}

Para controlar esto, vuelve a intentar la llamada en intervalos exponencialmente más grandes hasta que tenga éxito. Si agotas la cuota con regularidad, considera incluir más entidades en una solicitud a la API. Puedes incluir hasta 1,000 entidades en una llamada a la API.

Tiempos de procesamiento de actualizaciones en tiempo real

Una entidad actualizada a través de una actualización en tiempo real se procesa en 5 minutos.