用C语言从54张推理笔记扑克牌组织中抽两组牌,各五张,判断是否为顺子,如果是,比较两组牌的大小

分享一个德州扑克的:最大牌型,比牌逻辑的算法和洗牌的方法a year ago  这里说明下,ABCD代表四种不同的花色,2-16代表不同的牌面,A用14代替,我想不用多解释吧!  首先是洗牌这块,我们奔着不重复造轮子的思想,借用Collections.shuffle(List)接口,去将52张牌打乱顺序,然后随机随机抽取。
首先是,获取每个玩家的最大牌型,即从N张扑克中取出5张最大的,我们从N张牌中抽出5张牌,有N多种算法,这里给出一个算法private static Map&Integer, List&Poker&& SevenToFiveGroups(List&Poker& map)
Map&Integer, List&Poker&& group = new HashMap&Integer, List&Poker&&();
int num = 0;
for (int a = 0; a & 3; a++)
for (int b = a + 1; b & 4; b++)
for (int c = b + 1; c & 5; c++)
for (int d = c + 1; d & 6; d++)
for (int e = d + 1; e & 7; e++)
List&Poker& pukeGroup = new ArrayList&Poker&();
pukeGroup.add(map.get(a));
pukeGroup.add(map.get(b));
pukeGroup.add(map.get(c));
pukeGroup.add(map.get(d));
pukeGroup.add(map.get(e));
group.put(num++, pukeGroup);
在取得所有可能的组合之后,我们从这些组合中得到最大的一副手牌。为了得到最大的一副手牌,我们计算每付(五张牌)手牌的大小。首先对这五张牌进行排序,从大到小,手牌的大小为一个Long整形的数,手牌等级占两位(比如高牌为10,一对为11,二两为12,以此类推),五张扑克,每张扑克的数值占两位,所以手牌的大小是一个12位的整数,  比如图1.2的一副牌手牌等级第一张牌第二张牌第三张牌第四张牌第五张牌10A(A)U(B)10(C)9(D)7(C)
图1.2   这副手牌的大小为   需要注意的是,在遇到有对子的是情况,无论是两对还是三双,都要进行特殊排序,葫芦和三双的情况下,要把三个一样的大的牌排到前面,然后再排对子,这样才能保证在比较牌大小的情况下,正确比较出大小。还有就是在遇到A2345这样的顺子的情况下,要讲A排在最后,因为34567的顺子是比A2345大的。当然这两种情况是属于比较特殊情况,需要特别处理。对应程序的算法为:  首先计算手牌的等级,如果是顺子或者同花就不用说了,对子三双葫芦起始是相对比较难比较的,这里给出一个算法,int Pukelevel = -1;
int flag = 0;
for (int i = 0; i & list.size(); i++)
for (int j = i + 1; j & list.size(); j++)
if (list.get(i).getNum() == list.get(j).getNum())
switch (flag)
this.level即牌型, 就是这样计算出来的,然后就是计算这副手牌的大小了!long lon = L * 10;
this.pkValue = 0L;
for(int i = 0 ; i & this.list.size() ; i++)
int interval = 1;
for(int j = j & this.list.size() - 1 ; j ++)
interval *= 10;
interval *= 10;
this.pkValue += this.list.get(i).getNum() *
this.pkValue += this.level *
  剩下的就是对所有的情况,进行排序;所有玩家比较的时候,也是这样的情况!
希望对大家有帮助。更多技术干货,请关注:16收藏分享举报文章被以下专栏收录汇集阿里技术精粹-yq.aliyun.com{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&&,&permission&:&COLUMN_PUBLIC&,&memberId&:,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&汇集阿里技术精粹-yq.aliyun.com&,&urlToken&:&yunqichengxuyuan&,&id&:29437,&imagePath&:&v2-f41c4ececa862f50bdaa851db41c3f54.jpg&,&slug&:&yunqichengxuyuan&,&applyReason&:&0&,&name&:&我是程序员&,&title&:&我是程序员&,&url&:&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fyunqichengxuyuan&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:14441,&avatar&:{&id&:&v2-f41c4ececa862f50bdaa851db41c3f54&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-f41c4ececa862f50bdaa851db41c3f54_l.jpg&,&articlesCount&:641},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-af23d550ee9fa2c30c528b0c51150c21_r.jpg&,&lastUpdated&:,&imagePath&:&v2-af23d550ee9fa2c30c528b0c51150c21.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[707,],&summary&:&4月10日上午11点多,人工智能“冷扑大师”在与中“国龙之队”的六位德扑高手连续比了四天半后,人类选手再次完败。这篇人工智能的热点新闻也是一时间刷屏。小编也来凑凑热闹,不过作为一个维护世界和平的程序员,不能只做一个吃瓜群众。分享一篇德州扑克的…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T11:43:47+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:2704272,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&分享一个德州扑克的:最大牌型,比牌逻辑的算法和洗牌的方法&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:29437,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-af23d550ee9fa2c30c528b0c51150c21_r.jpg&,&author&:{&bio&:&汇集阿里技术精粹!微信号yunqiinsight&,&isFollowing&:false,&hash&:&65b52731faea3de2ef3fffa1&,&uid&:282900,&isOrg&:true,&slug&:&a-li-yun-yun-qi-she-qu-48&,&isFollowed&:false,&description&:&“云栖社区”是阿里云官方开发者技术社区,聚焦于传播云计算、大数据等DT时代核心技术的内容与资源。&,&name&:&阿里云云栖社区&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Forg\u002Fa-li-yun-yun-qi-she-qu-48&,&avatar&:{&id&:&v2-dae7f28042aecbfa2284cc&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:true,&isBanned&:false},&memberId&:,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:609522}],&title&:&分享一个德州扑克的:最大牌型,比牌逻辑的算法和洗牌的方法&,&author&:&a-li-yun-yun-qi-she-qu-48&,&content&:&4月10日上午11点多,人工智能“冷扑大师”在与中“国龙之队”的六位德扑高手连续比了四天半后,人类选手再次完败。这篇人工智能的热点新闻也是一时间刷屏。小编也来凑凑热闹,不过作为一个维护世界和平的程序员,不能只做一个吃瓜群众。分享一篇德州扑克的算法内容给大家练练手,没准下一次的打败人类AI程序员就是你哦:(本文由云栖社区:\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyq.aliyun.com\u002Fusers\u002F3424\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E石门-archy\u003C\u002Fa\u003E 提供)\u003Cp\u003E德州扑克想必很多人都玩过,当然对于新手需要说明的是,德州指的是德克萨斯州,而不是山东德州。\u003C\u002Fp\u003E\u003Cp\u003E
这几个月一直在做一个德州扑克的服务器,分享下在计算最大牌型,比牌逻辑的算法和洗牌的方法,希望对大家有帮助。\u003C\u002Fp\u003E\u003Cp\u003E
首先我们定义一下Poker类\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Epublic class Poker\n{\n
private S \u002F\u002F 图片扑克花色的表示(代表的是红桃、黑桃,梅花、方块\ \u002F\u002F 表示扑克牌面的大\n \n
public Poker(String tag, int num)\n
this.num =\n
this.tag =\n
public int getNum()\n
public void setNum(int num)\n
this.num =\n
public void setTag(String tag)\n
this.tag =\n
public String getTag()\n
public String toString()\n
return \& tag: \& + this.tag +\& num: \& + this.\n
\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cp\u003E  这里说明下,ABCD代表四种不同的花色,2-16代表不同的牌面,A用14代替,我想不用多解释吧!\u003C\u002Fp\u003E\u003Cp\u003E  首先是洗牌这块,我们奔着不重复造轮子的思想,借用Collections.shuffle(List)接口,去将52张牌打乱顺序,然后随机随机抽取。\u003C\u002Fp\u003E\u003Cp\u003E
首先是,获取每个玩家的最大牌型,即从N张扑克中取出5张最大的,我们从N张牌中抽出5张牌,有N多种算法,这里给出一个算法\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eprivate static Map&Integer, List&Poker&& SevenToFiveGroups(List&Poker& map)\n
Map&Integer, List&Poker&& group = new HashMap&Integer, List&Poker&&();\n
int num = 0;\n
for (int a = 0; a & 3; a++)\n
for (int b = a + 1; b & 4; b++)\n
for (int c = b + 1; c & 5; c++)\n
for (int d = c + 1; d & 6; d++)\n
for (int e = d + 1; e & 7; e++)\n
List&Poker& pukeGroup = new ArrayList&Poker&();\n
pukeGroup.add(map.get(a));\n
pukeGroup.add(map.get(b));\n
pukeGroup.add(map.get(c));\n
pukeGroup.add(map.get(d));\n
pukeGroup.add(map.get(e));\n
group.put(num++, pukeGroup);\n
num = 0;\n\n
}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cp\u003E
在取得所有可能的组合之后,我们从这些组合中得到最大的一副手牌。为了得到最大的一副手牌,我们计算每付(五张牌)手牌的大小。首先对这五张牌进行排序,从大到小,手牌的大小为一个Long整形的数,手牌等级占两位(比如高牌为10,一对为11,二两为12,以此类推),五张扑克,每张扑克的数值占两位,所以手牌的大小是一个12位的整数,\u003C\u002Fp\u003E\u003Cp\u003E  比如图1.2的一副牌\u003C\u002Fp\u003E\u003Cp\u003E手牌等级\u003C\u002Fp\u003E\u003Cp\u003E第一张牌\u003C\u002Fp\u003E\u003Cp\u003E第二张牌\u003C\u002Fp\u003E\u003Cp\u003E第三张牌\u003C\u002Fp\u003E\u003Cp\u003E第四张牌\u003C\u002Fp\u003E\u003Cp\u003E第五张牌\u003C\u002Fp\u003E\u003Cp\u003E10\u003C\u002Fp\u003E\u003Cp\u003EA(A)\u003C\u002Fp\u003E\u003Cp\u003EU(B)\u003C\u002Fp\u003E\u003Cp\u003E10(C)\u003C\u002Fp\u003E\u003Cp\u003E9(D)\u003C\u002Fp\u003E\u003Cp\u003E7(C)\u003C\u002Fp\u003E\u003Cp\u003E
图1.2\u003C\u002Fp\u003E\u003Cp\u003E   这副手牌的大小为 \u003C\u002Fp\u003E\u003Cp\u003E  需要注意的是,在遇到有对子的是情况,无论是两对还是三双,都要进行特殊排序,葫芦和三双的情况下,要把三个一样的大的牌排到前面,然后再排对子,这样才能保证在比较牌大小的情况下,正确比较出大小。还有就是在遇到A2345这样的顺子的情况下,要讲A排在最后,因为34567的顺子是比A2345大的。当然这两种情况是属于比较特殊情况,需要特别处理。\u003C\u002Fp\u003E\u003Cp\u003E对应程序的算法为:\u003C\u002Fp\u003E\u003Cp\u003E  首先计算手牌的等级,如果是顺子或者同花就不用说了,对子三双葫芦起始是相对比较难比较的,这里给出一个算法,\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eint Pukelevel = -1;\n
int flag = 0;\n
for (int i = 0; i & list.size(); i++)\n
for (int j = i + 1; j & list.size(); j++)\n
if (list.get(i).getNum() == list.get(j).getNum())\n
switch (flag)\n
\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cbr\u003E
this.level即牌型, 就是这样计算出来的,然后就是计算这副手牌的大小了!\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Elong lon = L * 10;\n
this.pkValue = 0L;\n
for(int i = 0 ; i & this.list.size() ; i++)\n
int interval = 1;\n
for(int j = j & this.list.size() - 1 ; j ++)\n
interval *= 10;\n
interval *= 10;\n
this.pkValue += this.list.get(i).getNum() *\n
this.pkValue += this.level *\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E  剩下的就是对所有的情况,进行排序;所有玩家比较的时候,也是这样的情况!\u003C\u002Fp\u003E\u003Cp\u003E
希望对大家有帮助。\u003C\u002Fp\u003E\u003Cp\u003E更多技术干货,请关注:\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Forg\u002Fa-li-yun-yun-qi-she-qu-48\u002Fposts\& class=\&internal\&\u003E阿里云云栖社区\u003C\u002Fa\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T03:43:47.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:3,&collapsedCount&:0,&likeCount&:16,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-af23d550ee9fa2c30c528b0c51150c21_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&程序员&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&编程学习&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&德州扑克&}],&adminClosedComment&:false,&titleImageSize&:{&width&:600,&height&:333},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&yunqichengxuyuan&,&name&:&我是程序员&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:3,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T11:43:47+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&学生&,&isFollowing&:false,&hash&:&a5aa62ee173&,&uid&:990500,&isOrg&:false,&slug&:&song-rui-qi-77&,&isFollowed&:false,&description&:&&,&name&:&宋瑞琪&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fsong-rui-qi-77&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&abf641b4c101eeeaa5850df1&,&uid&:422100,&isOrg&:false,&slug&:&li-zi-jie-17-44&,&isFollowed&:false,&description&:&&,&name&:&李子杰&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fli-zi-jie-17-44&,&avatar&:{&id&:&71ba83c6a87c42d4413e&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&作曲&,&isFollowing&:false,&hash&:&c17ca9b848abbf&,&uid&:306000,&isOrg&:false,&slug&:&pi-li-run&,&isFollowed&:false,&description&:&&,&name&:&噼里run&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fpi-li-run&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&机关外勤&,&isFollowing&:false,&hash&:&01ea5bfc2ffedff8a119730&,&uid&:235000,&isOrg&:false,&slug&:&dancematthiola&,&isFollowed&:false,&description&:&&,&name&:&dancematthiola&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fdancematthiola&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&计算机硬件技术&,&isFollowing&:false,&hash&:&1d285f1e181e436f9918&,&uid&:971100,&isOrg&:false,&slug&:&eudorapeony&,&isFollowed&:false,&description&:&&,&name&:&eudorapeony&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Feudorapeony&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&4月10日上午11点多,人工智能“冷扑大师”在与中“国龙之队”的六位德扑高手连续比了四天半后,人类选手再次完败。这篇人工智能的热点新闻也是一时间刷屏。小编也来凑凑热闹,不过作为一个维护世界和平的程序员,不能只做一个吃瓜群众。分享一篇德州扑克的…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002F50\u002Fv2-606cfd92e552d22ff37fc_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&阿里云&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&阿里巴巴集团&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&峰会&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&汇集阿里技术精粹!微信号yunqiinsight&,&isFollowing&:false,&hash&:&65b52731faea3de2ef3fffa1&,&uid&:282900,&isOrg&:true,&slug&:&a-li-yun-yun-qi-she-qu-48&,&isFollowed&:false,&description&:&“云栖社区”是阿里云官方开发者技术社区,聚焦于传播云计算、大数据等DT时代核心技术的内容与资源。&,&name&:&阿里云云栖社区&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Forg\u002Fa-li-yun-yun-qi-she-qu-48&,&avatar&:{&id&:&v2-dae7f28042aecbfa2284cc&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:true,&isBanned&:false},&column&:{&slug&:&yunqichengxuyuan&,&name&:&我是程序员&},&content&:&\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-aee9b2d0bd714b7ce6551_b.jpg\& data-rawwidth=\&1469\& data-rawheight=\&450\& class=\&origin_image zh-lightbox-thumb\& width=\&1469\& data-original=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-aee9b2d0bd714b7ce6551_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Ch2\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fpromotion.aliyun.com\u002Fntms\u002Fact\u002Fyunqi\u002Fnanjingapplynormal2017.html%3Fspm%3Da21cy.625.1.Ms4MdI\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E免费报名——〉\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Ch2\u003E\u003Cb\u003E大会嘉宾:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-1cd62cf9ac1d3cf30783_b.jpg\& data-rawwidth=\&899\& data-rawheight=\&289\& class=\&origin_image zh-lightbox-thumb\& width=\&899\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-1cd62cf9ac1d3cf30783_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E——————————————————————————————————\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E会议日程:\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyunqi.aliyun.com\u002FFnanjing\u002Fmeeting%3Fspm%3Da21cy.031.3.Ms4MdI%23426-01\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E主论坛\u003C\u002Fa\u003E:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E9:00-9:10
致辞——特邀嘉宾 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E9:10-9:30
主题演讲:飞天·智能——胡晓明 阿里巴巴集团资深副总裁、阿里云总裁 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E9:30-9:40
重磅发布一\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E9:40-9:50
重磅发布二\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E9:50-10:00
重磅发布三\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E10:00-10:20
主题演讲:工业互联网新时代——创新客户代表 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E10:20-10:40
主题演讲:大数据助力制造升级——创新客户代表 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E10:40-10:50
重磅发布四\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E10:50-11:00
重磅发布五\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E11:00-11:10
重磅发布六\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E11:10-11:30
主题演讲:云数据 大计算——闵万里 阿里云人工智能科学家 \u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyunqi.aliyun.com\u002FFnanjing\u002Fmeeting%3Fspm%3Da21cy.031.3.Ms4MdI%23426-02\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E企业级互联网架构专场\u003C\u002Fa\u003E:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E13:30-14:15
企业级互联网架构(Aliware)实践——钟华 阿里中间件高级架构师 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E14:15-15:00
Aliware云产品领航2017——赵林 阿里中间件资深产品专家 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E15:00-15:30
DT时代企业智能转型路径及最佳实践——合作伙伴代表 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E15:30-16:00
新零售—业务中台和数据中台最佳实践——行业标杆客户 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E16:00-16:30
阿里云工业互联网与制造升级——行业标杆客户 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E16:30-17:00
混合云—企业上云的最佳实践——黄兵 阿里云企业业务事业部高级专家 \u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyunqi.aliyun.com\u002FFnanjing\u002Fmeeting%3Fspm%3Da21cy.031.3.Ms4MdI%23426-06\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E新制造专场\u003C\u002Fa\u003E:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E13:30-14:00
新制造的核心竞争力----挖掘数据价值——敬请期待 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E14:00-14:30
新制造的实践路径----畅享数据红利——敬请期待 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E14:30-15:00
DT技术助推制造业智能转型——敬请期待 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E15:00-15:30
智能制造的众志成城----众智平台——敬请期待 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E15:30-16:00
阿里云1+30+300项目详解——敬请期待 \u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E16:00-17:00
对话:理论派、观望者和行动家——敬请期待 \u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyunqi.aliyun.com\u002FFnanjing\u002Fmeeting%3Fspm%3Da21cy.034.3.VRutXg\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E点击查看更多议程——〉\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E——————————————————————————————————\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E会议指南\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E\u003Cb\u003E南京香格里拉酒店\u003C\u002Fb\u003E—南京·鼓楼区·中央路329号\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E参会须知\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003EQ1、如何表示报名成功,参加大会的凭据是什么?\u003Cbr\u003EA:报名成功后,会收到报名成功的短信。进入会场凭借二维码和本人身份证,二维码将在开会前3天左右发送到报名时的手机上。\u003Cbr\u003EQ2、没有报名的人临时到会场当场报名可以吗? \u003Cbr\u003EA:非常抱歉,因为会场安排的问题,暂时不支持临时报名。\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E交通指南\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E- 南京禄口国际机场,驾车距离40公里(约45分钟) \u003Cbr\u003E- 南京火车站,驾车距离3.6公里(约8分钟)\u003Cbr\u003E- 南京南站,驾车距离16公里(约38分钟)\u003Cbr\u003E- 市中心,驾车距离4.4公里(约10分钟)\u003Cbr\u003E- 地铁1号线新模范马路站,步行距离300米(约5分钟)\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E住宿指南\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E汉庭酒店(玄武门店),步行距离300米(约5分钟) 桔子酒店(玄武门店),步行距离300米(约5分钟)\u003Cbr\u003E- 古都饭店,步行距离500米(约7分钟)\u003Cbr\u003E- 南京玄武门亚朵酒店,步行距离600米(约10分钟)\u003Cbr\u003E- 南京威斯汀大酒店,步行距离850米(约15分钟)\u003Cbr\u003E- 玄武饭店,步行距离900米(约15分钟)\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E餐饮指南\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E除了附近的餐饮店外,以下购物广场和美食街均可用餐:\u003Cbr\u003E三牌楼大街(打车5分钟) 金茂广场购物中心(金茂汇,步行10分钟)\u003Cbr\u003E湖南路美食一条街(步行15分钟)\u003Cbr\u003E地铁1号线至市中心新街口站(新模范马路-新街口,约15分钟)\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E停车指南\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E会议酒店停车场对外6元\u002F小时,每天48元封顶。\u003Cbr\u003E\u003Ch2\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fpromotion.aliyun.com\u002Fntms\u002Fact\u002Fyunqi\u002Fnanjingapplynormal2017.html%3Fspm%3Da21cy.625.1.Ms4MdI\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E免费报名——〉\u003C\u002Fa\u003E\u003C\u002Fh2\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T10:32:48+08:00&,&url&:&\u002Fp\u002F&,&title&:&飞天-智能:2017云栖大会-南京峰会免费报名中&,&summary&:&\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fpromotion.aliyun.com\u002Fntms\u002Fact\u002Fyunqi\u002Fnanjingapplynormal2017.html%3Fspm%3Da21cy.625.1.Ms4MdI\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E免费报名——〉\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003Cb\u003E大会嘉宾:\u003C\u002Fb\u003E—————————————————————————————————— \u003Cb\u003E会议日程:\u003C\u002Fb\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyunqi.aliyun.com\u002FFnanjing\u002Fmeeting%3Fspm%3Da21cy.031.3.Ms4MdI%23426-01\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E主论坛\u003C\u002Fa\u003E:9:00-9:10 致辞——特邀嘉宾 9:10-9:30 主题演讲:飞天·智能——胡晓明 阿里巴巴集团资深副总裁、阿里云总裁 9:30-9:40 重磅发布…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:2,&likesCount&:5},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&阿里巴巴集团&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&程序员&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&代码托管&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&汇集阿里技术精粹!微信号yunqiinsight&,&isFollowing&:false,&hash&:&65b52731faea3de2ef3fffa1&,&uid&:282900,&isOrg&:true,&slug&:&a-li-yun-yun-qi-she-qu-48&,&isFollowed&:false,&description&:&“云栖社区”是阿里云官方开发者技术社区,聚焦于传播云计算、大数据等DT时代核心技术的内容与资源。&,&name&:&阿里云云栖社区&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Forg\u002Fa-li-yun-yun-qi-she-qu-48&,&avatar&:{&id&:&v2-dae7f28042aecbfa2284cc&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:true,&isBanned&:false},&column&:{&slug&:&yunqichengxuyuan&,&name&:&我是程序员&},&content&:&\u003Cp\u003E本文主要介绍了阿里巴巴集团代码服务团队,在过去一年基于GitLab进行的代码托管分布式改造,希望与大家进行分享与探讨,为云上开发者提供更好的代码托管服务。\u003C\u002Fp\u003E\u003Cp\u003E本文由:\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fli-bin-45-33\u002Factivities\& class=\&internal\&\u003Ebilly.lb\u003C\u002Fa\u003E 提供\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E一、背景介绍\u003C\u002Fh2\u003E\u003Cp\u003E毋庸置疑,代码是DevOps流程的起点,是所有研发流程的基础;代码托管为代码“保驾护航”,确保代码的安全性、可用性,同时提供围绕代码的一些基础服务,如\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fdocs.gitlab.com\u002Fee\u002FGitLab-basics\u002Fadd-merge-request.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EMR\u003C\u002Fa\u003E、\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fdocs.gitlab.com\u002Fee\u002FGitLab-basics\u002Fcreate-issue.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EIssue\u003C\u002Fa\u003E等等。\u003C\u002Fp\u003E\u003Cp\u003E阿里巴巴集团GitLab是基于GitLab社区版8.3版本开发,目前支撑全集团数万规模的研发团队,累计创建数十万项目,日请求量千万级别,存储TB级别,早已超过了GitLab社区版承诺的单机上限能力,且增长速度迅猛。\u003C\u002Fp\u003E\u003Cp\u003E面对这种情况,顺理成章的做法就是——扩容。然而非常不幸,GitLab的设计没有遵守Heroku推崇的\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002F12factor.net\u002Fzh_cn\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E“The Twelve-Factor App”\u003C\u002Fa\u003E的第四条:“把后端服务当作附加资源”(即对应用程序而言,不管是数据库、消息队列还是缓存等,都应该是附加资源,通过一个url或是其他存储在配置中的服务定位来获取数据;部署应可以按需加载或卸载资源),具体体现是:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003EGit仓库数据存储于服务器本地的文件系统之上\u003C\u002Fli\u003E\u003Cli\u003EGitLab所依赖的三个重要组件:libgit2、git、grit也都是直接操作在文件系统上GitLab\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E所以GitLab社区版是基于“单机”模式设计,当存储容量和单机负载出现瓶颈时,难以扩容!\u003C\u002Fp\u003E\u003Ch2\u003E二、面对挑战\u003C\u002Fh2\u003E\u003Cp\u003E2015年初,阿里巴巴集团GitLab的单机负载开始呈现居高不下的情况,当时的应对方案是同步所有仓库信息到多台机器,将请求合理分配到几台机器上面从而降低单机的负载。然而这个方法治标不治本:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E系统运行过程中的数据同步消耗资源和时间,不可能无限制扩充机器\u003C\u002Fli\u003E\u003Cli\u003E这种方案暂时缓解了单机负载的问题,但对于单机存储上限的问题束手无策\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E2015年中,团队正式启动了第一次改造尝试,当时的思路是去掉对本地文件系统的依赖,使用网络共享存储,具体思考和方案可以参见\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fruby-china.org\u002Ftopics\u002F30146\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003ERailsConf 2016 - 我们如何为三万人的公司横向伸缩 GitLab\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Cp\u003E然而由于本地缓存等问题的限制,网络共享存储的方案在性能上出现较明显性能问题,且大都为基于C\u002FC++的底层改动,改造成本出现不收敛情况。而当时集团GitLab服务器在高峰期CPU屡屡突破**95%**甚至更高的警戒值,而高负载也导致了错误请求占比居高不下,无论是对上游应用的稳定性还是对用户体验都提出了严峻挑战。\u003C\u002Fp\u003E\u003Cp\u003E2016年8月起新一轮改造开始。\u003C\u002Fp\u003E\u003Ch2\u003E三、改造方案\u003C\u002Fh2\u003E\u003Cp\u003E既然共享存储的方案暂时行不通(后续如果网络存储的读写性能有质的提升,未尝不是好的方式),首先明确了唯有分布式或者切片才能解决问题的基本思路。\u003Cbr\u003E我们注意到,GitLab一个仓库的特征性名称是\&namespace_path\u002Frepo_path\&,而且几乎每个请求的URL中都包含着个部分(或者包含ID信息)。那么我们可以通过这个名称作分片的依据,将不同名称的仓库路由到不同的机器上面,同时将对于该仓库的相关请求也路由到对应机器上,这样服务就可以做到水平扩展。\u003C\u002Fp\u003E\u003Cp\u003E下面通过一幅图介绍一下目前集团GitLab在单个机房内的架构。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-36b73b3ef_b.png\& data-rawwidth=\&935\& data-rawheight=\&871\& class=\&origin_image zh-lightbox-thumb\& width=\&935\& data-original=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-36b73b3ef_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E\u003Cb\u003E3.1 各个组件的功能主要是:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003ESharding-Proxy-Api用于记录仓库与目标机器之间的对应关系,可以看作切片的大脑\u003C\u002Fli\u003E\u003Cli\u003EProxy负责对请求做统一处理,通过Sharding-Proxy-Api获取信息,从而将请求路由到正确的目标机器\u003C\u002Fli\u003E\u003Cli\u003EGit Cluster由多组节点构成,每组节点内有三台机器,分别为master,mirror和backup。其中master主要负责处理写(POST\u002FPUT\u002FDELETE)请求,mirror主要负责读(GET)请求,backup作为该节点内的热备机器\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E说明\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Emaster在处理完写请求后,会同步更新此次变更到mirror和backup机器,以确保读请求的正确性和热备机器的数据准确\u003C\u002Fli\u003E\u003Cli\u003E之所以没有采用双master的模式,是不想造成在脏数据情况下,由于双向同步而造成的相互覆盖\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E3.2 保证方案可用\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E如何确保切片信息准确\u003Cbr\u003ESharding-Proxy-Api基于\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fgo-martini\u002Fmartini\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Emartini\u003C\u002Fa\u003E架构开发,实时接收来自**GitLab**的通知以动态更新仓库信息,确保在namespace或project增删改,以及namespace_path变更、仓库transfer等情况下数据的准确性。\u003Cbr\u003E备注:这样的场景下,等于每次请求多了一次甚至多次与Sharding-Proxy-Api的交互,最初我们曾担心会影响性能。事实上,由于逻辑较为简单以及golang在高并发下的出色表现,目前Sharding-Proxy-Api的rt大约在5ms以内。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E如何做到切片合理性\u003Cbr\u003E海量数据的情况下,完全可以根据namespace_path的首字母等作为切片依据进行哈希,然而由于某些名称的特殊性,导致存在热点库的情况(即某些namespace存储量巨大或者相应请求量巨大),为此我们为存储量和请求量分配相应的权重,根据加权后的结果进行了分片。目前来看,三个节点在负载和存储资源占用等方面都比较均衡。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E如何处理需要跨切片的请求\u003Cbr\u003EGitLab除了对单namespace及project的操作外,还有很多跨namespace及project的操作,比如transfer project,fork project以及跨project的merge request等,而我们无法保证这些操作所需的namespace或project信息都存储在同一台机器上。\u003Cbr\u003E为此,我们修改了这些场景下的GitLab代码,当请求落到一台机器同时需要另一台机器上的某个namespace或project信息时,采用ssh或者http请求的方式来获取这些信息。\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003E最终的目标是采用rpc调用的方式来满足这些场景,目前已经在逐步开展。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E3.3 提升性能\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003Essh协议的替换\u003C\u002Fp\u003E\u003Cp\u003E目前阿里巴巴集团GitLab提供ssh协议和http协议两种方式,供用户对代码库进行fetch和push操作。其中,原生的ssh协议是基于操作系统的sshd服务实现,在GitLab高并发ssh请求的场景下,出现了诸如这样的bug:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fsystemd\u002Fsystemd\u002Fissues\u002F2925\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Elogind randomly loses its dbus connection\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fsystemd\u002Fsystemd\u002Fissues\u002F1961\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003ELeak of scope units slowing down \&systemctl list-unit-files\& and delaying logins\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E由此产生的问题是:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Essh协议登陆服务器变慢\u003C\u002Fli\u003E\u003Cli\u003E用户通过ssh协议fetch和push代码时速度变慢\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E为此,我们采用golang重写了基于ssh协议的代码数据传输功能,分别部署在proxy机器以及各组节点的GitLab服务器上。由此带来的好处有:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E机器负载明显降低\u003C\u002Fli\u003E\u003Cli\u003E消除上述bug\u003C\u002Fli\u003E\u003Cli\u003E在ssh服务发生问题的情况下,仍旧可以通过ssh登陆(使用原生)服务器,以及重启sshd服务不会对服务器本身造成影响\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E下图是proxy机器采用新sshd服务后的cpu使用情况:\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-0a4f735ddfbfeb3_b.png\& data-rawwidth=\&526\& data-rawheight=\&302\& class=\&origin_image zh-lightbox-thumb\& width=\&526\& data-original=\&http:\u002F\u002Fpic4.zhimg.com\u002Fv2-0a4f735ddfbfeb3_r.png\&\u003E\u003C\u002Ffigure\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E个别请求的优化和重写\u003C\u002Fp\u003E\u003Cp\u003E对于一些请求量较大的请求,例如鉴权、通过ssh key获取用户信息等接口,我们目前是通过文本转md5,加索引等方式进行性能优化,后期我们希望通过golang或java进行重写。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E3.4 确保数据安全\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E一主多备\u003C\u002Fp\u003E\u003Cp\u003E如上面提到的,目前阿里集团GitLab的每组分片节点包含有三台机器,也就是相对应的仓库数据一备三,即使某一台甚至两台机器发生磁盘不可恢复的故障,我们仍旧有办法找回数据。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E跨机房备份\u003C\u002Fp\u003E\u003Cp\u003E刚刚过去的三月份,我们完成了阿里巴巴集团GitLab的跨机房切换演习,模拟机房故障时的应对策略。演习过程顺利,在故障发生1min内接到报警,人工干预(DNS切换)后5min内完成机房间流量切换。\u003C\u002Fp\u003E\u003Cp\u003E多机房容灾的架构如下图所示:\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\u002Fpic3.zhimg.com\u002Fv2-a9b82f147dc_b.png\& data-rawwidth=\&1348\& data-rawheight=\&1009\& class=\&origin_image zh-lightbox-thumb\& width=\&1348\& data-original=\&http:\u002F\u002Fpic3.zhimg.com\u002Fv2-a9b82f147dc_r.png\&\u003E\u003C\u002Ffigure\u003E\u003C\u002Fp\u003E\u003Cp\u003E保证准实时的仓库数据同步是机房切换的基础,我们的思路按照实际需求,由容灾机房机器主动发起数据同步流程,基本步骤是:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E利用GitLab的system hook,在所有变更仓库信息的情景下发出消息(包含事件类型及时间包含数据等)\u003C\u002Fli\u003E\u003Cli\u003E同机房内部署有hook接收服务,在接收到hook请求后对数据进行格式化处理,并向\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fhelp.aliyun.com\u002Fdocument_detail\u002F27414.html%3Fspm%3D5176.doc.XXL8tZ\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E阿里云MNS(Message Notify Service)\u003C\u002Fa\u003E的相关主题发送消息\u003C\u002Fli\u003E\u003Cli\u003E容灾机房内,部署有消息消费服务,会订阅相关的MNS主题以实时获取online机房发送到主题内的消息,获取消息后调用部署在容灾机房GitLab节点机上的rpc服务,主动发起并实现数据同步的逻辑\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cblockquote\u003E\u003Cp\u003Ehook接收、消息消费以及**GitLab**节点机上的rpc服务,均由golang实现。其中rpc服务基于\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fgrpc\u002Fgrpc-go\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Egrpc-go\u003C\u002Fa\u003E,采用\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fwww.ibm.com\u002Fdeveloperworks\u002Fcn\u002Flinux\u002Fl-cn-gpb\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Eprotobuf\u003C\u002Fa\u003E来序列化数据。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E通过一段时间的运行和演习,已经确定了方案切实可行,在数据校验相关监控的配合下,容灾机房可以准实时同步到online机房的数据,且确保99.9%至99.99%的数据一致性。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E3.5 如何提升系统的可用性\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E日志巡检\u003Cbr\u003E面对集团GitLab每天产生的大量日志,我们使用阿里自研的监控工具进行日志监控,对系统产生的5xx请求进行采集和报警,然后定期去排查其中比较集中的错误。经过一段时间的排查和处理,5xx错误日志大致可以分为:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E分布式改造带来的跨分片操作的bug\u003C\u002Fli\u003E\u003Cli\u003EGitLab本身的bug\u003C\u002Fli\u003E\u003Cli\u003E高并发情况下带来的系统偶发性故障\u003C\u002Fli\u003E\u003Cli\u003E数据库相关的错误等\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E由于用户量大,场景多,阿里巴巴集团GitLab的使用场景基本覆盖GitLab的所有功能,因此也可以暴露出一些GitLab自有的bug。如\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgitlab.com\u002FGitLab-org\u002FGitLab-ce\u002Fmerge_requests\u002F9796\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EFix bug when system hook for create deploy key\u003C\u002Fa\u003E(从此,咱也是给GitLab供献过代码的人了)。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E服务器监控\u003C\u002Fp\u003E\u003Cp\u003E无论系统多少健壮,完备的监控是确保系统平稳运行的基础,既可以防患于未然,也可以在问题出现时及早发现,并尽可能减小对用户的影响。目前阿里巴巴集团GitLab的监控主要有:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E机器cpu,内存、负载等基本指标的监控\u003C\u002Fli\u003E\u003Cli\u003Essh、ping等网络检测信息(用于判断是否宕机,后将详述)\u003C\u002Fli\u003E\u003Cli\u003E服务器各个端口的健康检查(80,90xx,70xx等等)\u003C\u002Fli\u003E\u003Cli\u003E异步消息队列长度的监控\u003C\u002Fli\u003E\u003Cli\u003E数据库连接的检查\u003C\u002Fli\u003E\u003Cli\u003E错误请求的监控\u003C\u002Fli\u003E\u003Cli\u003ESharding-Proxy-Api与GitLab的数据一致性校验\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cblockquote\u003E\u003Cp\u003E很自豪的一点是,我们经常可以根据报警信息,先于用户发现问题。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E单机故障的自动切换\u003C\u002Fp\u003E\u003Cp\u003E虽然监控足够完备,但谁也不能保证服务器永远不宕机,因此我们在同一组节点中保有一台backup机器以应对服务器故障。会有专门的client定期通过API轮询监控平台提供的机器监控信息,当确认机器宕机时(ssh和ping同时不通,且持续时间超过2min)自动触发机器角色的互换,包括master与backup互换,mirror与backup互换等。通过演习,我们已经具备了单机故障时5min内全自动实现机器切换的能力。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E机房故障时的切换\u003C\u002Fp\u003E\u003Cp\u003E即前述的跨机房切换。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E3.6 单元化部署\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E单元化架构是从并行计算领域发展而来。在分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含的安装。而一个分区(Shard),则是整体数据集的一个子集,如果你用尾号来划分用户,那同样尾号的那部分用户就可以认为是一个分区。单元化就是将一个服务设计改造让其符合单元特征的过程。\u003C\u002Fp\u003E\u003Cp\u003E为了实现单元化的目标,我们在最初设计时就往这方面考虑。比如跨机房备份中,消息消费应用需要调用**Sharding-Proxy-Api**获取rpc服务的地址时,尽可能做到数据在单机房内闭环。这样在满足单元化要求的同时,也可以在机房故障时,尽量不影响已进入队列的消息在消费时出现数据断流。\u003C\u002Fp\u003E\u003Cp\u003E现在阿里巴巴集团GitLab在架构上已经基本具备了单元化部署的能力,这样的情况下,无论是后续与阿里云合作对外提供服务,还是当收购海外公司需要单独搭建新服务时,都不会遇到问题。\u003C\u002Fp\u003E\u003Ch2\u003E四、未来的改进\u003C\u002Fh2\u003E\u003Cp\u003E\u003Cb\u003E4.1 偶发的cache大量释放\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E由于GitLab有大量的IO操作,使得系统占用cache的数值巨大,也正是因为cache,系统的性能得到保证。然而成也cache败也cache,为了确保系统不会发生OOM,我们设定了vm.min_free_kbytes,当cache占用过多且需要继续申请大片内存时,会触发cache的释放,势必会影响释放瞬间请求处理能力(通过日志分析得到,此瞬间的处理能力仅为cache存在时的1\u002F2左右),直接后果是该瞬间的请求堵塞,甚至出现部分502。\u003C\u002Fp\u003E\u003Cp\u003E为此我们咨询了系统部的同学,根据他们的建议修改了部分内核参数(目前仍没有根治),后续会尝试升级内核的方式,也希望遇到过类似问题或对这方面问题有研究的同学,把你的秘籍传给我们。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E4.2 自动化运维\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E目前集团GitLab的发布主要靠手,在分布式架构下,机器势必越来越多,全自动化的发布、扩容机制,是我们需要完善的地方。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E4.3 rpc方案的最终落地\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E如前所述,只有最终实现了全局的rpc替换,才能将web服务所消耗的资源与Git本身消耗的资源进行分离,阿里巴巴集团GitLab的分布式改造才能算最终结束。\u003C\u002Fp\u003E\u003Ch1\u003E后续\u003C\u002Fh1\u003E\u003Cp\u003E
监控及日志数据对比显示,过去一年中\u003Cstrong\u003E阿里巴巴集团GitLab请求量增长4倍,项目数增长130%,用户数增长56%,在这样的增速下,系统调用的正确率却从99.5%提升到了99.99%以上\u003C\u002Fstrong\u003E,这些数字印证了我们方案的可行性和可用性。\u003C\u002Fp\u003E\u003Cp\u003E
接下来的时间里,小伙伴们会为继续代码服务的创新而努力,“高扩展、分布式、响应式、大文件、按需下载、流控、安全、数据化、单元化”,有些我们做到了,有些是接下来努力的方向。\u003C\u002Fp\u003E\u003Cp\u003E
现在阿里巴巴集团GitLab的架构,已经足够支撑百万规模的用户体量。在经过阿里工程师、开发者的千锤百炼之下,我们有勇气和信心通过\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fclick.aliyun.com\u002Fm\u002F1F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E阿里云code(阿里云代码开发服务现可免费使用)\u003C\u002Fa\u003E\u003Cstrong\u003E为更多的开发者提供代码托管服务,共同打造云上的协同研发生态!\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E本文作者:\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fyq.aliyun.com\u002Fusers\u002F2920\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ebilly.lb\u003C\u002Fa\u003E
屹恒\u003C\u002Fp\u003E\u003Ch1\u003E有关:阿里云 code \u003C\u002Fh1\u003E\u003Cp\u003E这是一款从未在外面推广过的代码托管产品,估计很多人还不知道阿里云有这个服务。阿里云code旨在解决部分中小企业选择内部自行搭建 Git或SVN ,势必会遇到搭建、维护成本高,难于扩展和备份,数据安全和可靠性差的问题。\u003C\u002Fp\u003E\u003Cp\u003E核心优势——阿里云上基于Git的分布式代码托管,高可用、安全、高性能以及无限容量是其核心竞争力,支持svn仓库的便捷迁移。\u003C\u002Fp\u003E\u003Cp\u003E目前已面向个人或企业免费提供Git及SVN两种协议模式的代码托管服务:\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fclick.aliyun.com\u002Fm\u002F1F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E点击免费使用\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T11:58:19+08:00&,&url&:&\u002Fp\u002F&,&title&:&阿里是如何打造支撑百万用户的分布式代码托管平台?&,&summary&:&本文主要介绍了阿里巴巴集团代码服务团队,在过去一年基于GitLab进行的代码托管分布式改造,希望与大家进行分享与探讨,为云上开发者提供更好的代码托管服务。本文由:\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fli-bin-45-33\u002Factivities\& data-editable=\&true\& data-title=\&billy.lb\& class=\&\&\u003E\u003Cb\u003Ebilly.lb\u003C\u002Fb\u003E\u003C\u002Fa\u003E 提供 一、背景介绍毋庸置疑,代码是DevOps流程的起点,是所有研发流程的基础;…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:8,&likesCount&:23}},&annotationDetail&:null,&commentsCount&:3,&likesCount&:16,&FULLINFO&:true}},&User&:{&a-li-yun-yun-qi-she-qu-48&:{&isFollowed&:false,&name&:&阿里云云栖社区&,&headline&:&“云栖社区”是阿里云官方开发者技术社区,聚焦于传播云计算、大数据等DT时代核心技术的内容与资源。&,&avatarUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-dae7f28042aecbfa2284cc_s.jpg&,&isFollowing&:false,&type&:&org&,&slug&:&a-li-yun-yun-qi-she-qu-48&,&bio&:&汇集阿里技术精粹!微信号yunqiinsight&,&hash&:&65b52731faea3de2ef3fffa1&,&uid&:282900,&isOrg&:true,&description&:&“云栖社区”是阿里云官方开发者技术社区,聚焦于传播云计算、大数据等DT时代核心技术的内容与资源。&,&badge&:{&identity&:{&description&:&已认证的官方帐号&},&bestAnswerer&:null},&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Forg\u002Fa-li-yun-yun-qi-she-qu-48&,&avatar&:{&id&:&v2-dae7f28042aecbfa2284cc&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:true,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&growthSearch&:&s2&,&sEI&:&c&,&nwebQAGrowth&:&experiment&,&qawebRelatedReadingsContentControl&:&close&,&liveStore&:&ls_a2_b2_c1_f2&,&nwebSearch&:&nweb_search_heifetz&,&rt&:&y&,&isOffice&:&false&,&enableTtsPlay&:&post&,&newLiveFeedMediacard&:&new&,&newMobileAppHeader&:&true&,&androidPassThroughPush&:&all&,&hybridZhmoreVideo&:&yes&,&nwebGrowthPeople&:&default&,&nwebSearchSuggest&:&default&,&qrcodeLogin&:&qrcode&,&enableVoteDownReasonMenu&:&enable&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&androidDbRecommendAction&:&open&,&biu&:&1&,&androidDbFeedHashTagStyle&:&button&,&appStoreRateDialog&:&close&,&default&:&None&,&isNewNotiPanel&:&no&,&biua&:&1&,&zcmLighting&:&zcm&,&adR&:&b&,&wechatShareModal&:&wechat_share_modal_show&,&growthBanner&:&default&,&androidProfilePanel&:&panel_b&}},&columns&:{&next&:{},&yunqichengxuyuan&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fyunqichengxuyuan&,&name&:&我是程序员&,&creator&:{&slug&:&a-li-yun-yun-qi-she-qu-48&},&url&:&\u002Fyunqichengxuyuan&,&slug&:&yunqichengxuyuan&,&avatar&:{&id&:&v2-f41c4ececa862f50bdaa851db41c3f54&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&switches&:{&couldSetPoster&:false},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{&baidu&:false,&yidianzixun&:false,&qqnews&:false},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false,&userAgent&:{&ua&:&Mozilla\u002F5.0 (compatible, MSIE 11, Windows NT 6.3; Trident\u002F7.0; rv:11.0) like Gecko&,&browser&:{&name&:&IE&,&version&:&11&,&major&:&11&},&engine&:{&version&:&7.0&,&name&:&Trident&},&os&:{&name&:&Windows&,&version&:&8.1&},&device&:{},&cpu&:{}}},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 推理笔记扑克牌组织 的文章

 

随机推荐