Distribuido comprensión de bloqueo de la solución técnica

Distribuido comprensión de bloqueo de la solución técnica

weixin_33709364

prefacio

Debido a que en el trabajo diario, el servidor en línea es una implementación distribuida de múltiples, a menudo se enfrentan con la solución de los problemas de consistencia de datos distribuidos en la escena, después que harían uso de bloqueo distribuido para resolver estos problemas.

El primer paso, sus escenarios de negocio:

En mi diario para hacer el proyecto, el escenario actual de negocios consiste en lo siguiente:

Escena uno: por ejemplo, asignar tareas escena. En este escenario, porque el negocio es los sistemas de back-office de la compañía, sobre todo para los auditores de auditoría, la concurrencia no es muy alto, pero las reglas de asignación de tareas de diseño se activa cada vez que los auditores solicitan a salir adelante, a continuación, tareas asignadas por el servidor de un grupo al azar de las tareas seleccionadas. La escena que se ve aquí se sentirá relativamente simple, pero el proceso de asignación real, lo que se refiere a los problemas urgentes de la agrupación de usuario, de modo más complejo de lo que he descrito, pero en este caso para ilustrar el problema, podemos mantener las cosas simples de entender. Así, en el curso, sobre todo para evitar la misma tarea adquieren simultáneamente dos auditores para el problema. Terminé usando una tabla de recurso de bloqueo base de datos distribuida basado en problemas a resolver.

Escena dos: como escenarios de pago. En este escenario, ofrezco tres a los usuarios a proteger la privacidad de los usuarios el número de teléfono móvil (estos números se obtienen de los operadores en, y número de teléfono celular real, tienen el mismo aspecto), lo que permite a los usuarios seleccionar uno para hacer una compra, el usuario después de que el pago de la compra, que necesita el usuario para seleccionar el número asignado a los usuarios, sino que también tendrá otra opción puesto en libertad. En este proceso, el número de usuario que se proyectarán dentro de un cierto tiempo (usuario proyectará dentro del marco de tiempo normal) para que el usuario actual tiene la exclusividad para este producto, con el fin de asegurar el pago 100% se puede obtener, y porque el fondo de recursos producto recursos limitados, sino también para mantener el flujo de recursos que no pueden dejar que los recursos durante mucho tiempo ha ocupado de un usuario. Para el diseño del servicio de destino en la línea cuando un proyecto es por lo menos capaz de soportar QPS pico solicitar 300, mientras que en el proceso de diseño a considerar el tema de la experiencia del usuario. Terminé usando el memecahed el método y el problema de bloqueo tabla de recursos de base de datos distribuida basado en add () para resolver.

Escena tres: Tengo un servicio de datos, en la cantidad de 300 millones de llamadas al día, todos los días por 86.400 segundos calcula QPS en 4000, debido a la cantidad de llamadas de servicio durante el día a ser significativamente más alta que en la noche, por lo que durante el pico de día y por la tarde llegó a QPS 6000, un total de hay cuatro servidores, un solo CPE para ser capaz de llegar a más de 3.000. Terminé usando los Redis de setnx () y expirará () para resolver el problema de bloqueo distribuido.

Escena Cuatro: una versión mejorada de una escena y la escena dos. En este escenario, que no implica el pago. Sin embargo, debido a un proceso de asignación de recursos, la necesidad de mantener la coherencia implica aumentos locales, y diseñado para alcanzar un pico qps500, por lo que necesitamos para optimizar aún más la escena. Terminé usando los Redis de setnx (), expirará () y la tabla de base de datos distribuida basada en la cerradura tema a resolver.

Ver aquí, si usted piensa que propuse QPS escenario de negocio es lo suficientemente grande, quiero que lee, porque no importa lo que usted está en una empresa, el comienzo de la obra puede tener que comenzar desde la más sencilla. No amarre Li y Tencent QPS escena negocio lo grande, ya que en una gran escena así no puede estar implicado personalmente en el proyecto, no puede estar implicado personalmente en el proyecto es el núcleo del diseñador, es el núcleo del diseñador puede no ser capaz de diseñar su propio. Si realmente podemos cumplir con los tres anteriores, no se puede cerrar la página Kanla, si no, la propuesta todavía está leyendo, tengo que decir que la falta de lugares abiertos a sugerencias, me refiero a un lugar bueno, un punto también quiero alabar o comentario puede ser considerado como el mayor estímulo para mí ha.

El segundo paso, distribuido bloquear la solución:

  1. La primera cosa clara, se podría preguntar si puede ser considerado ReentrantLock de lograr, pero en realidad de lograr cuando hay un problema, ReentrantLock los requisitos de bloqueo y desbloqueo debe llevarse a cabo en el mismo hilo, y las aplicaciones distribuidas, de bloqueo y desbloqueo están dos solicitudes no relacionadas, y por lo tanto ciertamente no es el mismo hilo, y por lo tanto ReentrantLock inutilizable.
  2. Sobre la base de las tablas de base de hacer el bloqueo optimista para el bloqueo distribuido.
  3. De utilizando el método memcached add (), un bloqueo distribuido.
  4. De utilizando el método para la cerradura distribuido CAS memcached (). (No se utiliza)
  5. Uso de la setnx redis (), expiran método () para el bloqueo distribuido.
  6. Uso de la setnx redis (), obtener método (), GetSet () para el bloqueo distribuido.
  7. Redis utilizan el reloj, varios comandos, ejecutivo, para el bloqueo distribuido. (No se utiliza)
  8. Utilice empleado del zoológico, de bloqueo distribuido. (No se utiliza)

El tercer paso es hacer el bloqueo optimista basado en una tabla de recursos de base de datos para el bloqueo distribuido:

1. En primer lugar, el significado de bloqueo optimista:

La mayoría se basan en la versión de los datos (versión) del mecanismo de grabación de lograr. ¿Qué número de versión de datos? Los datos son la adición de un identificador de versión, la versión de las soluciones basadas en la base de datos de la tabla general, se puede lograr cuando la lectura de los datos mediante la adición de un campo de "versión" en la tabla de base de datos, leer juntos esta versión, después de la actualización, este número de versión se incrementa.

Durante la actualización, se comparan los números de versión, si es consistente, no ha cambiado, se ejecutará con éxito esta operación, caso de ser incompatible con el número de versión, la actualización fallará.

2. tener una cierta comprensión del significado de un bloqueo optimista, combinado con ejemplos específicos, la siguiente nos deducir cómo debemos tratar con:

(1) Supongamos que tenemos una tabla de recursos, como se muestra a continuación: t_resource, que tiene seis campos de ID, resoource, estado, ADD_TIME, update_time, versión, respectivamente, clave primaria, estado de la asignación de recursos (1 sin asignar 2 es distribución), el tiempo de creación de recursos, recursos actualizados número de versión de datos de recursos.

(2) supongamos que ahora nos id = 5780 asignado a estos datos, a continuación, el escenario no distribuida caso, por lo general primero echa un vistazo a los datos de estado = 1 (sin asignar), y de la cual los datos pueden ser seleccionados por un las siguientes afirmaciones, si se puede actualizar tiene éxito, que ha ocupado este recurso.

(3) Si en un escenario distribuido, ya que las operaciones de actualización de bases de datos son un átomo atómico es, de hecho, en la parte superior de esta declaración, en teoría, no hay ningún problema, pero si esta declaración en un típico "ABA", no podemos percepción. Uno puede preguntarse ¿cuál es el problema "ABA"? Usted puede buscar en Internet, aquí digo simple punto es, si se selecciona el primer y segundo proceso de actualización, ya que las dos operaciones son no atómica, por lo que este proceso, si hay un hilo, en el que ocupen los recursos (estado = 2), y luego liberar los recursos (estado = 1), la última vez que se ejecute la operación de actualización no hay manera de saber esto cambia de recursos sucedido. Tal vez usted dirá que usted debe estar bien en dicha escena, pero en el uso real, como por ejemplo un depósito en cuenta bancaria o de débito en el proceso, esta situación es más aterradora.

(4) Así que si usted está utilizando el bloqueo optimista con nosotros la forma de resolver el problema en la parte superior de la misma?

. Una primera seleccionar operaciones para consultar el número de versión de datos de los datos actuales, los datos tales como el número de versión actual es 26: SELECT ID, de recursos, estado, versión de t_resource donde estado = 1 andid = 5,780;

si. 执行 更新 操作: actualización del conjunto t_resoure estado = 2, version = 27, update_time = ahora () donde recurso = xxxxxx y estado = 1 y version = 26

c. Si la declaración anterior es verdadera actualización de la actualización afecta a una fila de datos, muestra un éxito marcador de posición. Si no actualiza afectada una fila de datos, entonces el recurso ha estado ocupando los otros.

3. por 2 a explicar, creo que tenemos a cómo hacer el bloqueo optimista basado en una tabla de base de datos tiene una cierta comprensión, pero todavía se necesita para explicar algunas de las desventajas basadas en tablas de bases de datos bloqueo optimista:

. (1) Este modo de operación, por lo que la actualización de tiempo original, debe convertirse en una segunda operación: seleccione un número de versión; actualización una vez. Aumentar el número de operaciones de bases de datos.

(2) Si una escena de negocios de procesos de negocio, se necesitan más recursos para asegurar la consistencia de los datos, a continuación, si todo la base de datos basada en los recursos utilizando la tabla de bloqueo optimista, que es tan necesario que cada recurso tiene una tabla de recursos, este en el uso real, la escena es, sin duda no está satisfecho. Y estos se basan en las operaciones de base de datos, en virtud de los requisitos de alta concurrencia, el costo de la conexión de base de datos debe ser insoportable.

(3). Mecanismos de bloqueo optimista se basan a menudo en el sistema de almacenamiento de datos lógicos, y por lo tanto pueden causar datos sucios se actualiza en la base de datos. En la etapa de diseño del sistema, hay que tener muy en cuenta la posibilidad de que estas situaciones surgen, y hacer los ajustes apropiados, tales como la estrategia de bloqueo optimista implementado en el procedimiento de base de datos almacenada, sobre la base de los datos disponibles solamente fuera de esta almacenados rutas de actualización de procedimiento, en lugar de la base de datos mesa de abrir directamente al público.

4. Destaca la implementación y desventajas de bloqueo optimista, y no tiene miedo a sentir un bloqueo optimista, ¿verdad? ? ?

Por supuesto que no, al principio del artículo mis propios escenarios de negocio, los escenarios 1 y 2 son parte de la escena basada en el uso de la tabla de recursos de base de datos bloqueo optimista, tenemos una buena solución al problema en línea. Por lo tanto tenemos que ser escenarios de negocio específicos de acuerdo con la solución técnica de elección, no sólo para encontrar una lo suficientemente complejas soluciones de tecnología de moda lo suficiente como para problemas de negocio es un programa bueno? ! Por ejemplo, si estoy en una escena, lo hago utilice el bloqueo del cuidador del zoológico, puede hacerlo, pero realmente necesario? ? ? La respuesta que no es necesario! ! !

Una cuarta etapa de usar método memcached add (), un bloqueo distribuido:

Para el método add memcached () para hacer un bloqueo distribuido, el Internet es una forma relativamente común, pero básicamente se puede resolver la mayoría de los escenarios en su propia mano. Antes de utilizar este método, ya que entender siempre que el complemento a fondo memcached () y diferencia de conjuntos (), y saber por qué se puede añadir () para hacer un bloqueo muy bien distribuida. Si no se conoce el método set () add () y, por favor, Baidu, esto necesita su propia mirada.

Quisiera señalar aquí es otra cuestión, cuando las personas se centran en el diseño de bloqueo distribuido es bueno o malo, se centrará en la cuestión de que si el estancamiento se puede evitar? ? ? ! ! !

Si se utiliza el comando add () memcached a la huella de recursos con éxito, entonces no es una cosa terminada de la misma? Por supuesto que no! Hay que especificar la clave de tiempo efectivo se añade actualmente utilizando el add (), y si no se especifica una hora válida, en circunstancias normales, puede después de realizar sus negocios, utilizamos el método de eliminación para eliminar la clave, que se libera los recursos utilizados. Sin embargo, si, después de ocupar el éxito, memecached propio negocio o servidor se cae, entonces no se liberarán los recursos. Así que mediante el establecimiento de tiempo de espera de clave, incluso durante una situación de tiempo muerto, ni va a atar a los recursos, los puntos muertos evitar.

El quinto paso, usando los cas memcached () método para bloqueo distribuido: Ligeramente

Una sexta etapa, utilizando el setnx redis (), expiran método () para el bloqueo distribuido:

Para el setnx Redis (), expirará () para implementar un bloqueo distribuido, este programa en relación con el programa de memcached add () (), Redis dominante es que es compatible con más tipos de datos, y memcached sólo el apoyo de una cadena tipos de datos. Además, tanto en términos de rendimiento, facilidad de operación, que es, de hecho, no hay mucha diferencia, totalmente su elección, como la compañía con la que más y más, que se puede utilizar.

En primer lugar, explicar setnx () de comandos, significado setnx se establece si no existe, hay dos parámetros principales setnx (clave, valor). Este método es atómica, si no existe la clave, entonces el conjunto de teclas actual éxito, devuelve 1; si la clave actual ya existe, entonces el conjunto de claves actual falla, devuelve 0. Sin embargo, tener en cuenta que setnx comando no puede establecer la clave de tiempo de espera, la llave sólo puede ser establecido por el expiran ().

El uso de pasos específicos son los siguientes:

  1. setnx (lockkey, 1) si el retorno 0, entonces la ocupación fallado; si devuelve 1, indica marcador de posición exitosa
  2. expirará mando () para establecer el tiempo de espera lockkey, con el fin de evitar el estancamiento.
  3. Después de realizar código de negocio, se puede eliminar la clave por el comando de eliminación.
    Este programa realmente puede atender las necesidades de trabajo diario, sino de una discuten soluciones técnicas, puede ser un lugar perfecto. Por ejemplo, si el frente después de realizar una exitosa primera setnx paso, el expiran () comando se ejecuta correctamente, el fenómeno se produce el tiempo de inactividad, entonces el problema es aún interbloqueo se produce, por lo que si quieres ser perfecto, puede utilizar Redis el método setnx (), get () y GetSet () para implementar un bloqueo distribuido.

Un séptimo paso, utilizando el método setnx redis (), get (), GetSet () para el bloqueo distribuido:

Antecedentes Este programa se centra principalmente en los programas setnx () y expirará () para el problema de interbloqueo puede existir, hizo una versión optimizada.

Así que primero explicar estos tres comandos, para setnx () y get () estos dos comandos, no creen nada más que decir. Así comando GetSet ()? Este comando tiene dos principales parámetros GetSet (clave, nuevoValor). Este método es atómica, el valor de la tecla SET nuevoValor, y devolver el valor antiguo de la llave original. La suposición original de que la clave no existe, a continuación, ejecutar este comando en repetidas ocasiones, el efecto de los siguientes casos:

  1. GetSet (clave "valor1") devuelve el valor nulo clave en este momento se establecerá valor1
  2. GetSet (clave "valor2") devuelve el valor de la clave en este momento valor1 valor2 se establece en
  3. Y así sucesivamente!

Después describe el comando para ser utilizado, el uso de pasos específicos son los siguientes:

  1. setnx (lockkey, la corriente + tiempo de espera de tiempo expira), si devuelve 1, la cerradura se adquiere con éxito;
    si no devuelve 0 cerradura adquirida, 2 turno.
  2. obtener (lockkey) Obtiene el valor oldExpireTime, y este valor y el valor actual de la hora del sistema, y ​​si menos de la hora del sistema actual, se considera que el bloqueo de haber agotado el tiempo, puede permitir que otras peticiones de readquirir los de dirección 3.
  3. Cálculo newExpireTime = tiempo actual + tiempo de espera expira, entonces GetSet (lockkey, newExpireTime) devuelve el valor actual de currentExpireTime lockkey.
  4. Juicio currentExpireTime y oldExpireTime son iguales, si son iguales, lo que indica que la actual GetSet establecido con éxito, para conseguir una cerradura. Si no son iguales, lo que indica que el bloqueo se ha solicitado otra cosa escapar, entonces el error solicitud actual puede volver directamente, o continuar para volver a intentarlo.
  5. Después de adquirir el bloqueo, el subproceso actual puede comenzar su propio proceso de negocio, cuando se termine el proceso, comparar su tiempo de proceso y de un conjunto de bloqueo de tiempo de espera, si es menor que el conjunto de bloqueo de tiempo de espera, luego ejecutado directamente eliminar el bloqueo se libera; si hay más de ajuste de tiempo de espera de bloqueo, las cerraduras no necesitan ser procesados.

Nota: Cuando se utiliza este programa que tenía en la línea no es ningún problema, por lo que cuando empezó a escribir este artículo también cree que no hay ningún problema. Pero a partir del 13/05/2017 (sábado), en su propio tiempo de volver a este artículo, leer un montón de comentarios de amigos próximo artículo, me encontré con dos problemas se concentran:

Pregunta 1: En el "obtener (lockkey) Obtiene el valor oldExpireTime" Esta operación "GetSet (lockkey, newExpireTime)" entre esta operación, si hay N hilos consiguen las mismas operaciones oldExpireTime adquiridos después, y luego ir GetSet, voluntad no volverá newExpireTime son los mismos, que será un éxito, y luego tener que conseguir una cerradura? ? ?

Creo que este programa no es la existencia de este problema. Hay dos bases: En primer lugar, REDIS es un único subproceso modelo de proceso, el orden de ejecución de serie. En segundo lugar, bajo la condición de ejecución en serie, y luego regresó GetSet currentExpireTime compara con oldExpireTime son iguales.

Problema 2: En el "obtener (lockkey) Obtiene el valor oldExpireTime" la operación "GetSet (lockkey, newExpireTime)" entre la operación, si hay N hilos consiguen la misma operación adquirida después oldExpireTime, y luego ir GetSet, suponiendo el primer hilo se adquiere el éxito de bloqueo, otra adquisición de bloqueo fracasó, pero no para adquirir el hilo de bloqueo que no se ejecuta el comando GetSet iniciado, que no causa el hilo de tiempo de espera de bloqueo para adquirir el bloqueo primer conjunto se ha extendido? ? ?

Creo que este programa puede ser el problema no existe. Pero, personalmente, creo que esta sonrisa de error es insignificante, pero impreciso en soluciones técnicas, podemos elegir su propio Ja.

Octavo paso, utilizando los Redis miran, múltiples comandos, ejecutivo de bloqueo distribuido:

El noveno paso, utilizando ZooKeeper, un bloqueo distribuido:

El décimo paso, resumen

En resumen, el primer artículo sobre bloqueo distribuido me termina aquí, en el artículo se describe el proyecto principal diario se utiliza para comparar las cuatro opciones, controlamos estos cuatro programas, de hecho, en su trabajo diario cerradura distribuida puede resolver muchos de los problemas en el escenario de negocios. Desde el principio de mi propio uso real, sino que también se puede ver, por así decirlo del todo hay una cierta base. Además de estas tres opciones, yo en el próximo artículo sobre el bloqueo distribuidos en, y luego explorar.

Comúnmente utilizado cuatro escenarios:

  1. Sobre la base de las tablas de base de hacer el bloqueo optimista para el bloqueo distribuido.
  2. De utilizando el método memcached add (), un bloqueo distribuido.
  3. Uso de la setnx redis (), expiran método () para el bloqueo distribuido.
  4. Uso de la setnx redis (), obtener método (), GetSet () para el bloqueo distribuido.

Menos común, pero puede ser utilizado para explorar la solución técnica:

  1. De utilizando el método para la cerradura distribuido CAS memcached ().
  2. Redis utilizan el reloj, varios comandos, ejecutivo, para el bloqueo distribuido.
  3. Utilice empleado del zoológico, de bloqueo distribuido.

Escrito en los últimos

fuente original: https://shimo.im/docs/f2ajdNJBQJItSobT/

Reproducido en: https: //www.cnblogs.com/Java-no-1/p/11061262.html

Publicado 17 artículos originales · ganado elogios 224 · vistas 290 000 +

Supongo que te gusta

Origin blog.csdn.net/cxu123321/article/details/105092497
Recomendado
Clasificación