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

Estoy estudiando Mean Stack Framework, ¿es válido para mi carrera?

Aprendí un poco de HTML y CSS, por lo que puedo escribir código básico. Pero, ¿cómo llego mi código al sitio web? FTP? ¿Lo escribo en mi sitio web?

Cómo crear mis propias entradas para eventos

Tenía muchas ganas de aprender programación de computadoras. Sé un mínimo de HTML y CSS. ¿Qué idioma debería aprender realmente para hacer cosas geniales?

Actualicé a 4.2.2 con WordPress y ahora no puedo acceder a la función de administrador del sitio. Peor aún, el sitio en sí muestra un mensaje de error codificado (falta el argumento 2, etc.) en la parte superior de la pantalla y no puedo desplazarme hacia abajo. Cualquier ayuda / dirección sería muy apreciada?

Cómo construir un sitio web desde el principio

¿Necesito construir una aplicación Hybird? ¿JQuery Mobile todavía se considera una buena opción para eso?

Estoy planeando iniciar un sitio web, algo como ScoopWhoop / BuzzFeed. ¿Cuáles son algunas sugerencias útiles?

Estoy interesado en el desarrollo web pero no tengo antecedentes en él. ¿Qué lenguaje (s) de programación debo elegir y por qué?

Me pidieron que buscara una granja de renderizado para enviar modelos 3D a, para ser renderizados como imágenes 2D, no animaciones. ¿Que debería buscar?

He creado mi sitio web en mi servidor local y estoy listo para comprar un hosting y un nombre de dominio. ¿Qué debo elegir y por qué?

Cómo obtener un servicio de alojamiento compartido SSD con un buen soporte

Quiero crear una aplicación a gran escala usando PHP. ¿Cuál es el mejor marco para trabajar con PHP?

Creamos un sitio web usando WordPress, y ahora tenemos dos problemas que no podemos solucionar. ¿Alguien puede explicarnos cómo resolverlos de la manera más simple?

¿Cómo obtengo exactamente datos de películas como títulos, clasificaciones, actores, etc., de IMDb?