Estoy construyendo un sitio de subastas en línea. ¿Cómo evito una condición de carrera cuando varias personas ofertan a la vez?

En realidad, hay una pequeña posibilidad de una condición de carrera en un sitio de subastas a menos que realmente esté programando mal. Me pregunto si te equivocas en cuanto a qué condición de carrera es. No tiene nada que ver con el hecho de que las personas están “compitiendo” para obtener la última oferta.

Por ejemplo, la manera más fácil de garantizar que no haya condiciones de carrera sería crear un registro separado para cada oferta. Así es como la mayoría de la gente pensaría hacerlo de todos modos. Incluso en un nivel de actividad de eBay, esto no crearía suficientes datos para abrumar al servidor de la base de datos, y siempre podría eliminar las ofertas antiguas si fuera necesario.

Una condición de carrera ocurre cuando dos procesos intentan actualizar el mismo dato. Es por eso que, si tiene registros separados para cada oferta, nunca podría tener una condición de carrera, a menos que una persona intentara actualizar su información de perfil o detalles de la subasta, y por alguna razón intentara hacerlo en dos computadoras diferentes al mismo tiempo vez, presione el botón de enviar exactamente al mismo tiempo, e incluso entonces, tendría que tener un momento increíblemente desafortunado. E incluso si sucedieran todas esas cosas desafortunadas, una condición de carrera probablemente ni siquiera resultaría en que ocurriera algo malo.

Así es como ocurre una verdadera condición de carrera y por qué puede ser mala:

Digamos que está creando un sitio de comercio electrónico pesado y, en particular, desea realizar un seguimiento de los niveles de existencias. Como cada artículo en su tienda es un registro, usted decide agregar un campo a ese registro de artículo llamado NumberInInventory. Entonces, alguien pone un registro de Widgets y dice que tenemos 10 en stock. Cada vez que se compra un widget, primero consulta el registro para averiguar cuál es NumberInInventory, resta uno y escribe ese nuevo número en el campo NumberInInventory. El problema surge cuando te quedan 2 existencias y dos personas deciden comprar una exactamente al mismo tiempo (por ejemplo, en milisegundos entre sí). La persona A presiona Comprar, la computadora lee el campo NumberInInventory y obtiene 2. Luego, antes de que la computadora pueda restar 2–1 (pista, eso es bastante rápido), la Persona B presiona Comprar y la computadora, en un hilo diferente, lee el campo NumberInInventory y obtiene 2. Luego el hilo de la Persona A resta 2-1 y obtiene 1, que luego escribe en el campo NumberInInventory. Luego, el hilo de la Persona B resta 2-1 y obtiene 1, que luego escribe en el campo NumberInInventory.

Por lo tanto, a pesar de que tenía un inventario de 2 y dos personas cada uno compró uno, la base de datos todavía cree que tiene uno en el inventario, e intentará venderlo, lo que obviamente puede causar algunos problemas.

Pero el punto es que esto solo puede suceder cuando ambos intentan actualizar el mismo dato y cuando también intentan actualizarlo con un valor que depende de un estado anterior de esos datos. Si dos personas intentaran actualizar el nombre del elemento, por ejemplo, no podría existir una condición de carrera.

Técnicamente, también puede obtener condiciones de carrera actualizando campos separados en el mismo registro al mismo tiempo, solo en función de cómo funciona el funcionamiento interno de la base de datos, pero de nuevo, todo esto se mitiga simplemente usando registros separados y en línea sitio de subastas, no hay una razón real para no hacerlo.

Si bien puede ser poco probable al principio lidiar con las condiciones de la carrera, es una buena idea que lo hayas considerado de antemano, porque arreglar eso después podría ser un verdadero dolor de cabeza.

Esto es lo que consideraría:

  • Utilice una base de datos compatible con ACID ACID – Wikipedia
  • Haga que sus transacciones de la base de datos sean lo más atómicas (y rápidas) posible
  • Obtenga información sobre los bloqueos de la base de datos (cualquier base de datos que utilice). Bloqueo optimista versus pesimista
  • Obtenga información sobre el control de concurrencia multiversion y los niveles de aislamiento de su base de datos (qué sucede y qué se puede leer durante una transacción).
  • Tenga en cuenta que las inserciones de filas suelen ser más rápidas y fáciles que las actualizaciones de filas en la mayoría de los DB

Solo un ejemplo:

Si tiene una tabla de productos con una fila para cada producto, que contiene un campo con el monto de la oferta más alta actual, significa que debe actualizar (y bloquear) esta fila cada vez que ingresa una nueva oferta.

Pero si está utilizando otra tabla con una identificación de producto, identificación de usuario y todas las ofertas por producto de cada usuario, solo necesita insertar nuevas filas aquí. Seleccionar la oferta más alta en cualquier momento es simple, solo seleccione el MAX (‘cantidad de oferta’) de este producto. Agregar filas es seguro, porque no hay necesidad de un bloqueo de fila aquí.

En este caso, actualizaría la fila del producto con la oferta ganadora solo después de que la subasta haya finalizado. Mantenga el historial de los licitantes por un tiempo que se pueda volver a configurar, en lugar de eliminar (o mejor: archivar) estos registros.

Espero que ayude

Las solicitudes (también solicitudes POST de formularios que tienen ofertas) siempre vendrán en secuencia con una secuencia tal como la proporciona su servidor web, por lo tanto, trátelas de esta manera con los primeros en llegar, por ejemplo, la misma oferta que gana primero.

Eso no es una gran complicación con las subastas.

Con las computadoras cronometrando, es muy poco probable que dos personas oferten en la misma instancia, pero si lo hicieran, los servidores aún determinarían el ganador.

Lo más probable es que rechacen ambas ofertas instantáneamente y luego vuelvan a verificar dónde la latencia mostraría una u otra como la primera. En algún momento se convierte en la “suerte del sorteo”, donde algún enrutador o equilibrador de carga o incluso una colisión de Ethernet en algún lugar se retrasarían uno u otro.

Si tiene alguna pregunta, puede preguntarle a la persona que desarrolló su software.

No estoy seguro de lo que sucede, pero deberías echar un vistazo a un sitio que uso que casi siempre te garantiza ganar en una subasta de eBay por algún software inteligente.

Subasta francotirador.

Pruebe la ingeniería inversa y debería darle una idea de cómo los sitios de subastas manejan el problema.

More Interesting

Aprendí jQuery antes de JS, y ahora soy súper dependiente. ¿Cómo me vuelvo menos dependiente de jQuery y más de JS?

Tengo una idea para crear una red social de nicho. ¿Cómo empezar?

¿Puede uno ser un desarrollador de software y web (front-end) si comenzó a practicar en su adolescencia (14)? Si es así, ¿será difícil ser ambos?

Cómo eliminar una imagen de una base de datos y una carpeta SRC en PHP

¿Debo aprender el lenguaje JavaScript completo o es mejor aprender algunos relacionados con el desarrollo web en caso de que quiera convertirme en desarrollador web?

Estoy tratando de construir un backoffice para un sitio web, pero no quiero pasar por la molestia de diseñar los menús, formularios, etc. Estoy buscando una herramienta que me ayude a construir y aplicar un estilo estándar a mi páginas sin tener que escribir HTML y CSS. ¿Qué puedo usar?

Estoy considerando codificar bootcamps en Nueva York, particularmente para convertirme en un desarrollador de pila completa. ¿Qué bootcamp es el mejor?

Soy un profesional que trabaja en el campo de TI y me gustaría comenzar un negocio a tiempo parcial como segunda fuente de ingresos. ¿Cuáles son algunas buenas ideas que podría implementar para ganar dinero extra?

Quiero proporcionar transmisión de cricket en vivo en mi sitio web, ¿cómo puedo lograrlo?

Necesito agregar la función de notificación en mi sitio web como la de Facebook usando NODE JS y MONGO DB. ¿Cómo debo comenzar?

Cómo hackear un webcomic para ver publicaciones en cola

Mi profesor recomienda realizar pruebas unitarias cada vez que creo algo. ¿Es esta práctica realmente recomendada?

Cómo construir un sistema de gestión de asistencia usando Python

Quiero crear ID de correo electrónico (con mi nombre de dominio) con mi aplicación web de fondo (PHP / ROR). También quiero establecer una dirección de reenvío predeterminada para las ID de correo electrónico que he creado. ¿Cómo procedo con esto?

Soy un desarrollador que se está volviendo independiente. ¿Cuál es mi mejor apuesta para tener éxito?