camino a través de los programadores - desde la solicitud de 6000 por segunda charla de escritura

imagen

fondo

Cada una de las escenas de la película, han conservado su historial de visualización, detallado recuerda usted mira un par de veces, omita los de largo, según se informa en base a se pueden analizar estos datos te gusta japonés, con el fin de hacer empuje direccional. .....

Aunque se ve función muy sencilla, de hecho, la cantidad de datos involucrados es muy grande, para sus usuarios * producto de la serie de vídeo en circunstancias extremas.

Luego, en sólo dos servidores web, un caso de sqlserver, cómo hacer frente a dicha solicitud una escritura no es una gran cantidad de datos? ¿Por qué es una petición de escritura que? Debido a que cada segundo usuario ver el video que necesitas para grabar, por ejemplo: el décimo segundo de los usuarios de vídeo observaban. Para obtener esta característica, primero tiene que definir un par de cosas:

  1. Reloj de historia clínica de vídeo de definición de datos de usuario
  2. Y la interacción con el cliente del protocolo de datos
  3. Registrada en una base de datos de formato de datos
  4. ¿Cómo resolver la presión escrituras servidor (después de todo, un único número de solicitud del servidor es bastante grande)

soluciones

Ver video programación definida por el usuario

Para ver un vídeo, la cantidad de tiempo si hay una hora, lo que corresponde a 3.600 segundos 3600 si el estado de visualización, para el estado de visualización, sólo dos tipos de visualización y no visualización de estado, un poco suficiente, un byte (byte) tiene 8 bits, por lo que un byte puede representar el estado de visualización de 8 segundos, sobre esta base, mayor será la banda, el estado más el mismo número de caracteres representada.

Cada vez que el cliente cargue nuevas necesidades de datos y servicios de datos ya existe al igual que la operación de bits, por ejemplo: 01000 segundos representa el segundo reloj, cargar el nuevo cliente: 00011 representa 4,5 segundos son vigilados para los usuarios Introducción del primer video, 4, 5 segundos han visto, aunque sólo una operación simple, pero una gran cantidad de tiempo, el consumo de CPU no deben subestimarse.

第一字节    第二字节
  0 1 2 3 4 5 6 7  0 1 2 3 4 5 6 7 
bit:  1 0 0 0 1 0 0 0  0 1 0 0 0 0 0 0
二进制:  0x88    0x40
字符串:  8840
Y el protocolo de interacción con el cliente

Los usuarios ver información en tiempo real sobre el avance del video, sólo el cliente sepa que el cliente necesita ser cargado para ver el progreso de los datos del usuario y el servidor de interacción binaria se puede seleccionar relativamente fuerte hexadecimal universal, por supuesto, a elegir 100 hexagonal no importa, mientras ambas partes pueden apoyar, y ser capaz de resolver apropiadamente

formato de datos de la base de datos

Existen diferencias en cada base de datos apoyado tipos de datos, por lo que no es demasiado narrativa, por supuesto, sin importar el formato, ocupa espacio mejor, sino que también debe tenerse en cuenta se calcula de acuerdo a la cantidad de negocios.

Resolver el problema

problemas de rendimiento de la CPU

Después de todo, cada vez que el usuario debe ver a los últimos datos y los datos antiguos para hacer el trabajo de fusión, en el caso de grandes usuario no debe subestimarse. cpu después de la combinación de varias condiciones, el trabajo final combinada para hacer un 10 decimal, 16 hexagonal subido a los datos del cliente, y luego se convierte a decimal y el historial de visualización (10 decimal) para hacer la operación combinada, esta parte no se puede omitir procedimientos específicos para la conversión:

 //需要新加的数据
        ConcurrentQueue<UserVideoInfo> AddQueue = new ConcurrentQueue<UserVideoInfo>();

//把16进制的字符串按照两位 分割成十进制数组
        protected List<int> ConvertToProgressArray(string progressString)
        {
            if (string.IsNullOrWhiteSpace(progressString))
            {
                return null;
            }
            //验证是否为2的倍数长度
            if (progressString.Length % 2 != 0)
            {
                return null;
            }
            var proStrSpan = progressString.AsSpan();
            List<int> ret = new List<int>();
          
            int i = 0;
            while (i < proStrSpan.Length)
            {
                ret.Add(int.Parse(proStrSpan.Slice(i, 2).ToString(), System.Globalization.NumberStyles.HexNumber)); ;
                i = i + 2;
            }
            return ret;
        }
El cliente solicita el número de preguntas

Si diez mil usuarios al mismo tiempo mientras ve el video, subir el intervalo de datos es de 2 segundos, lo que significa que hay 5.000 solicitudes por segundo. Puesto que esto es sólo un negocio basado en el registro de usuario de negocios, ¿cuál es el tipo de registro, que puede tolerar una cierta pérdida de datos, los datos de la forma, el cliente puede hacer primero registrado en el búfer local, no hay necesidad de cargar uno registros de tiempo de segundos, como ahora acordado cliente 30 segundos para cargar un registro, si las vueltas de usuario en el cliente, cuando el siguiente arranque no se vuelve a cargar exitosa trayectoria.

Base de datos de presión

Si la base de datos se actualiza en cada solicitud de forma individual, de acuerdo con el artículo segundo de solicitud de actualización calculado hasta 5.000 veces por segundo. Cada vez que el usuario ve el video se cargan en la memoria caché, un análisis cuidadoso de este negocio, ya que es el tipo de datos de registro, así que cada vez que ha solicitado no es necesario actualizar la base de datos, pero la primera actualización de la memoria caché, y luego programado para actualizar la base de datos.

Dado que el problema del volumen de datos, toda la actualización se envía a una cola de trabajos, la voluntad por lotes cola ejecutor actualiza la base de datos basándose en la configuración de modo que una sola actuación base de datos de actualización es mucho más alto, de hecho, este tipo de programas son en muchos tipos de registro de negocio allí use, actualizaciones por lotes a la base de datos de una gran cantidad de presión para ser pequeño, parecido a los siguientes códigos

public async Task<int> AddUserVideoData(UserVideoInfo data, DBProcessEnum processType = DBProcessEnum.Update)
        {
            if(processType== DBProcessEnum.Add)
            {
                AddQueue.Enqueue(data);
            }
           
            return 1;
        }

 void MulProcessData()
        {
            //每次更新的条数
            int maxNumber = 50;
            List<UserVideoInfo> data = new List<UserVideoInfo>();
            while (true)
            {
                if (data == null)
                {
                    data = new List<UserVideoInfo>();
                }
                try
                {                   
                    if (!AddQueue.Any() && !UpdateQueue.Any())
                    {
                        System.Threading.Thread.Sleep(500);
                    }                   
                    else
                    {
                        //先处理 需要更新的
                        data.Clear();
                        while (data.Count <= maxNumber && AddQueue.Any())
                        {
                            if (!AddQueue.TryDequeue(out UserVideoInfo value))
                            {                                
                                continue;
                            }
                            //判断是否有重复对象
                            if (data.Any(s => s.UserId == value.UserId && s.VideoId == value.VideoId))
                            {
                                var exsitItem = data.First(s => s.UserId == value.UserId && s.VideoId == value.VideoId);
                                exsitItem = value;
                            }
                            else
                            {
                                data.Add(value);
                            }

                        }
                        if (data != null && data.Any())
                        {
                            var ret = UserVideoProgressProxy.Add(data);
                        }
                        
                    }
                }
                catch (Exception err)
                {
                    
                }


            }
        }

Escrito en los últimos

De hecho, este alto operaciones de IO, pero no es bueno con esta base de datos relacional SQL Server, NoSQL mucho mayor IO en esta situación simple, se puede cambiar a Redis tratan otro día, se estima que es mucho mejor que sqlserver.

Supongo que te gusta

Origin www.cnblogs.com/zhanlang/p/12446675.html
Recomendado
Clasificación