处理带有消息队列的“事务锁定”

时间:2019-04-28 20:29:04

标签: architecture queue message-queue messaging event-driven

如果先前的用户在队列中正在进行交易,那么如何确保其他用户无法完成交易?例如:

在订购系统中,require('shiny') require('ggplot2') require('shinyjqui') mtcars <- as.data.table(mtcars) max_plots <- 12; ui <- pageWithSidebar( headerPanel("Dynamic number of plots"), sidebarPanel(width = 2, sliderInput("n", "Number of plots", value=5, min=1, max=max_plots), h4('click points to see info'), h4('select area to zoom'), h4('Double click to unzoom') ), mainPanel( tags$head( tags$style(' #my_tooltip { position: absolute; pointer-events:none; width: 300px; z-index: 100; padding: 0; }'), tags$script(' $(document).ready(function() { $("[id^=plot]").mousemove(function(e) { $("#my_tooltip").show(); $("#my_tooltip").css({ top: (e.pageY + 5) + "px", left: (e.pageX + 5) + "px" }); }); });') ), tabsetPanel( tabPanel('fp1', uiOutput("FP1Plotmultiplots") ), tabPanel('clean', uiOutput("CleanFP1multiplots") ) ), style = 'width:1250px' ) ) server <- function(input, output, session) { plotlist <- c('FP1Plot', 'CleanFP1') ranges <- reactiveValues() # make the individual plots observe({ lapply(1:input$n, function(i){ plotname <- paste0('FP1Plot', i) output[[plotname]] <- renderPlot({ ggplot(mtcars, aes(wt, mpg, color = as.factor(cyl))) + geom_point() + coord_cartesian(xlim =ranges[[paste('FP1Plot', i, 'x', sep = '')]], ylim = ranges[[paste('FP1Plot', i, 'y', sep = '')]] ) + theme_classic() + theme(legend.text=element_text(size=12), legend.title=element_blank(), legend.position = 'bottom') }) }) }) observe({ lapply(1:input$n, function(i){ plotname <- paste0('CleanFP1', i) output[[plotname]] <- renderPlot({ ggplot(iris, aes(iris[ ,ncol(iris)-1], iris[ ,i], color = as.factor(Species))) + geom_point() + coord_cartesian(xlim =ranges[[paste('CleanFP1', i, 'x', sep = '')]], ylim = ranges[[paste('CleanFP1', i, 'y', sep = '')]] ) + theme_classic() + theme(legend.text=element_text(size=12), legend.title=element_blank(), legend.position = 'bottom') }) }) }) # make the divs with plots and buttons etc lapply(plotlist, function(THEPLOT) { output[[paste(THEPLOT, 'multiplots', sep = '')]] <- renderUI({ plot_output_list <- list() n <- input$n n_cols <- if(n == 1) { 1 } else if (n %in% c(2,4)) { 2 } else if (n %in% c(3,5,6,9)) { 3 } else { 4 } Pwidth <- 900/n_cols Pheigth <- 500/ceiling(n/n_cols) # calculate number of rows Pwidth2 <- Pwidth+40 Pheigth2 <-Pheigth+40 plot_output_list <- list(); for(i in 1:input$n) { plot_output_list <- append(plot_output_list,list( div(id = paste0('div', THEPLOT, i), wellPanel( plotOutput(paste0(THEPLOT, i), width = Pwidth, height = Pheigth, hover = hoverOpts(id = paste(THEPLOT, i, "hover", sep = '_'), delay = 0) # click = paste0(THEPLOT, i, '_click'), # dblclick = paste0(THEPLOT, i, '_dblclick'), # brush = brushOpts( # id = paste0(THEPLOT, i, '_brush'), # resetOnNew = TRUE # ) ), style = paste('border-color:#339fff; border-width:2px; background-color: #fff; width:', Pwidth2, 'px; height:', Pheigth2, 'px', sep = '')), style = paste('display: inline-block; margin: 2px; width:', Pwidth2, 'px; height:', Pheigth2, 'px', sep = '')) )) } do.call(tagList, plot_output_list) }) }) eg <- expand.grid(plotlist, 1:max_plots) tooltipTable <- reactive({ ## attempt to make this work for the large amount of plots in my app hovers <- as.list(sapply(c(sprintf('%s_%s', eg[,1], eg[,2])), function(key) key = eval(parse(text = paste('input$', key, '_hover', sep = ''))) )) notNull <- sapply(hovers, Negate(is.null)) if(any(notNull)){ plotid <- names(which(notNull)) plothoverid <- paste0(plotid, "_hover") dataset <- if(grepl('FP1Plot', plotid)) { mtcars } else { iris } ## I will add some code here based on the plot nr to grab the needed columns for the x and y data of the specific plot, since the list of x and y columns will be stored in two vectors: ## 1 vector with x parameter 1:12, and 1 for y. ## every group of plots will use the same list of selected x and y parameters # (or if I switch to plot group specific lists, the lists will contain the group names just like the plots, so I can link them by name here) y <- nearPoints(dataset, input[[plothoverid]], threshold = 15) if(nrow(y)){ datatable(t(y), colnames = rep("", nrow(y)), options = list(dom = 't')) } } }) output$my_tooltip <- renderUI({ req(tooltipTable()) wellPanel(DTOutput("vals"), style = 'background-color:#fff; padding:10px; width:400px;border-color:#339fff') }) output$vals <- renderDT({ tooltipTable() }) } shinyApp(ui, server) 在消息队列中推送“我将接受此订购”事件。但是1秒后,Staff A执行了相同的操作。后台工作人员尚未处理队列,因此两名工作人员均收到“确定”响应。鉴于存在冲突,Staff B的请求应已被拒绝。

除了直接的数据库更新之外,是否还有其他方法可以在消息队列的上下文中处理这种情况?

0 个答案:

没有答案