Как минимизировать задержку между службой приложений Azure и базой данных SQL Azure?
У нас есть приложение-служба приложений Azure, использующее Java Tomcat 8.5, работающее в западном регионе США. План обслуживания для этой услуги стандартный, большой.
Это приложение службы приложений подключено к службе базы данных SQL, которая принадлежит к группе Elastic Group также в западной части США, план обслуживания которой соответствует стандарту eDTU 1200.
Проблема, с которой мы сталкиваемся, заключается в очень низкой производительности взаимодействия обоих серверов.
Мы проводили тестирование, вызывая RESTful WebService для службы приложений, который должен вставить 50 записей в 2 таблицы в базе данных. Всего 100 записей вставлено. Для выполнения этой задачи требуется 3000 мс.
Мы измеряли это, сохраняя временные метки между началом процесса вставки и окончанием вставки. Таким образом, время от локального клиента до приложения службы связи не входит.
Если мы выполняем тот же вызов Restful WebService на локальном компьютере с базой данных SQL, работающей на том же локальном компьютере, что и сервер Tomcat, задача была выполнена за 400 мс.
Поэтому я собираюсь думать, что проблема должна заключаться в задержке соединения между этими двумя серверами в лазурном облаке или, может быть, я что-то здесь упустил.
Вот почему я спрашиваю, я довольно плохо знаком с лазурной технологией, и, возможно, есть другие варианты, которые мы можем использовать для обеспечения лучшей связи между серверами, или есть способ, которым я не знаю, чтобы решить эту проблему.
В качестве дополнительного вопроса, если этот 2 сервер находится внутри моего собственного центра обработки данных, я позабочусь о том, чтобы он общался напрямую в своей собственной сети, не будучи уверенным, доступен ли этот сервис в Azure в данный момент.
Это определения двух таблиц, в которые служба вставляет записи:
CREATE TABLE [dbo].[Vehiculo](
[Id] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
[CodigoCliente] [int] NOT NULL,
[NumeroVehiculo] [int] NOT NULL,
[Denominacion] [varchar](99) NOT NULL,
[NumeroTarjeta] [int] NULL,
[Placa] [varchar](10) NULL,
[CuentaPresupuestal] [varchar](99) NULL,
[NumeroPatrimonial] [varchar](99) NULL,
[Grupo] [varchar](99) NULL,
[NumeroEconomico] [varchar](99) NULL,
[ClienteId] [decimal](18, 0) NULL,
[UltimaActualizacion] [datetime] NULL,
[Tenant] [varchar](50) NULL,
[IdOrigenDeDatos] [decimal](18, 0) NOT NULL,
[FechaAlta] [datetime] NOT NULL,
[FechaUltimaModificacion] [datetime] NOT NULL,
[PrimerActualizacion] [datetime] NOT NULL,
CONSTRAINT [PK_Vehiculo] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[Cliente](
[Id] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
[Codigo] [int] NOT NULL,
[Denominacion] [varchar](255) NOT NULL,
[CondicionVenta] [varchar](50) NOT NULL DEFAULT ('N/A'),
[TipoDeValor] [varchar](50) NOT NULL DEFAULT ('N/A'),
[PlazoDePago] [int] NOT NULL DEFAULT ((0)),
[UltimaActualizacion] [datetime] NULL,
[Tipo] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Grupo] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Zona] [varchar](50) NOT NULL DEFAULT ('N/A'),
[EjecutivoDeCuenta] [varchar](50) NOT NULL DEFAULT ('NO INFORMADO'),
[Clasificador] [varchar](20) NOT NULL DEFAULT ('CLIENT'),
[Indicador001] [varchar](50) NULL,
[FechaIndicador001] [datetime] NULL,
[Indicador002] [varchar](50) NULL,
[FechaIndicador002] [datetime] NULL,
[Geolocalizacion] [varchar](50) NULL,
[Latitud] [decimal](8, 6) NULL,
[Longitud] [decimal](9, 6) NULL,
[Colonia] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Delegacion] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Ciudad] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Estado] [varchar](50) NOT NULL DEFAULT ('N/A'),
[Correo] [varchar](200) NULL,
[Tenant] [varchar](50) NULL,
[IdOrigenDeDatos] [decimal](18, 0) NOT NULL,
[FechaAlta] [datetime] NOT NULL,
[FechaUltimaModificacion] [datetime] NOT NULL,
[PrimerActualizacion] [datetime] NOT NULL,
CONSTRAINT [PK_Cliente] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Как вы можете видеть, первая таблица имеет 17 столбцов, а клиент имеет 29 столбцов.
1 ответ
Вы не можете ничего сделать, чтобы контролировать близость вашей виртуальной машины к вашей БД SQL, за исключением того, что они находятся в одном регионе и той же зоне доступности, если вы их используете. Несколько вещей для рассмотрения:
- Вы можете включить ускоренную сеть на вашей виртуальной машине, чтобы увеличить пропускную способность сети
- Если вы используете какой-либо VPN или Express Route для подключения обратно к локальным ресурсам, убедитесь, что трафик с виртуальной машины IaaS на PaaS SQL не перенаправляется обратно локально и из Интернета.
- Посмотрите на использование некоторых инструментов диагностики в Azure для измерения производительности, таких как Azure Monitor, Network Watcher и инструменты мониторинга SQL, чтобы увидеть, можете ли вы обнаружить какие-либо проблемы