Git Product home page Git Product logo

spikesystem's Issues

有几点疑问

1、如何临时追加库存
2、扣费成功后,发送mq失败怎么处理?
3、mq可能存在丢消息的情况;
4、redis数据可能存在丢失,如何处理?

想推荐你这个项目

大佬你好,我是Go语言中文网(https://studygolang.com )站长,看到你这个项目,很赞,我想分享给更多的 Go 语言爱好者。特向你申请授权我发布到网站和对应的公众号等渠道。因为会大量引用README中的内容,期待您的回复!谢谢!

readme 中lua脚本判断条件写反了

readme里lua脚本
if(ticket_sold_nums > ticket_total_nums) then
return redis.call('HINCRBY', ticket_key, ticket_sold_key, 1)
end

应该是
ticket_total_nums > ticket_sold_nums
代码里是对的

优化

if localSpike.LocalDeductionStock() && remoteSpike.RemoteDeductionStock(redisConn) {
		util.RespJson(w, 1,  "抢票成功", nil)
		LogMsg = LogMsg + "result:1,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)
	} else {
		util.RespJson(w, -1, "已售罄", nil)
		LogMsg = LogMsg + "result:0,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)
	}

失败应该回滚本地的一个记录

if localSpike.LocalDeductionStock() && remoteSpike.RemoteDeductionStock(redisConn) {
		util.RespJson(w, 1,  "抢票成功", nil)
		LogMsg = LogMsg + "result:1,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)
	} else {
		util.RespJson(w, -1, "已售罄", nil)
		spike.LocalSalesVolume = spike.LocalSalesVolume - 1   
		LogMsg = LogMsg + "result:0,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)
	}

库存量分配到本地机器机制或时机是怎样的

把库存分配到本地机器的机制是怎样的,在什么时机或以什么方式进行,怎样保证数据的一致性,如果 一台机器分配时没有成功,这台机器没有了库存,落在此机器上的请求会不会买不到票?

本地hash方案

感觉最后可以加一步,当余票很少时,也许把用户id本地hash,少于多少(比如还有10张票,QPS1w,用hash值少于多少卡掉99%的请求,使qps就100(为余票个数*10)就行)的直接返空,直接显示售罄了,这样让大部分本地库存不用再去请求redis远程减库存。

chan使用是否合理?

使用chan使得所有的请求在单实例中串行处理,是否会降低吞吐?
我理解本地库存最主要的目的,应该是当本地库存不足时,不去请求redis。保证本地库存源子操作这种需求源子操作或者用lock就可以解决,不必让所有请求的串行处理吧。
而且go chan底层也是基于lock实现的,通过benchmark chan 没体现出任何优势。
如果理解错误点 还望指正。

对Redis的压力也很大吧?

如果分库server的库存减和总redis库存减的操作是原子操作这个是前提的话,8点放票,此时库存都是足够的,瞬间所有的分仓库都会去请求Redis。100W并发请求,就可能有绝大多数的请求同样也会去Redis。 这个问题如何解决。单单去增加redis服务器的并发能力吗?

lua脚本

lua 脚本 >= 情况下会超卖一个,所以改成>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.