/// <summary>
        /// 获取分区id号  分区id号,规则1+数据节点编号+表分区编号
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public static int GetPartitionID(PartitionIDInfo info)
        {
            //PartitionIDInfo info = new PartitionIDInfo();string example = "10101";string strid = id.ToString();
            string id = "1" + PartitionNameRule(info.DataNodePartition) + PartitionNameRule(info.TablePartition);

            return(Convert.ToInt32(id));
        }
Beispiel #2
0
        private void CheckIfScanNewTable(tb_consumer_partition_model partition, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo)
        {
            var serverdate = Context.ManageServerTime.AddSeconds(-1);//此处延迟1秒,停顿消费者日分区表之间的切换
            if (serverdate != null && serverdate.Date > mqidinfo.Day.Date)//服务器时间和消息时间对应不上
            {
                SqlHelper.ExcuteSql(datanodeconnectstring, (c) =>
                    {
                        DateTime t = mqidinfo.Day.Date.AddDays(1);
                        while (serverdate.Date >= t)//查找最后的可用消息表,然后跳出
                        {
                            string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, t);
                            if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename))
                            {
                                AddExsitTableNameCache(tablename);
                                _lastpullququeiddic[partition.partitionid] = PartitionRuleHelper.GetMQID(new MQIDInfo()
                                {
                                    AutoID = 0,
                                    DataNodePartition = mqidinfo.DataNodePartition,
                                    TablePartition = mqidinfo.TablePartition,
                                    Day = t
                                });//重设第二天最小的id
                                break;
                            }

                            t = t.AddDays(1);
                        }
                    });
            }
        }
        /// <summary>
        /// 获取分区id号隐藏的信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static PartitionIDInfo GetPartitionIDInfo(int id)
        {
            PartitionIDInfo info = new PartitionIDInfo(); string example = "10101"; string strid = id.ToString();

            if (strid.Length != example.Length)
            {
                throw new Exception("分区Id格式不正确:" + id);
            }
            info.DataNodePartition = Convert.ToInt32(strid.Substring(1, 2));
            info.TablePartition    = Convert.ToInt32(strid.Substring(3, 2));
            return(info);
        }
Beispiel #4
0
 private List<tb_messagequeue_model> GetMessagesOfPatition(tb_consumer_partition_model partition, long scanlastmqid, MQIDInfo mqidinfo, string datanodeconnectstring, PartitionIDInfo partionidinfo)
 {
     //从数据库取数据,检查数据时间,和数据状态,无问题则插入队列,并修改上一次扫描的mqid
     List<tb_messagequeue_model> messages = new List<tb_messagequeue_model>();
     SqlHelper.ExcuteSql(datanodeconnectstring, (c) =>
     {
         string tablename = PartitionRuleHelper.GetTableName(partionidinfo.TablePartition, mqidinfo.Day);
         if (exsittablenames.ContainsKey(tablename) || c.TableIsExist(tablename))
         {
             AddExsitTableNameCache(tablename);
             tb_messagequeue_dal dal = new tb_messagequeue_dal(); dal.TableName = tablename;
             messages = dal.GetMessages(c, scanlastmqid, SystemParamConfig.Consumer_ReceiveMessageQuque_EVERY_PULL_COUNT);
         }
     });
     return messages;
 }
Beispiel #5
0
 private long StartMoveMQID(string fromtablename, PartitionIDInfo info, Dictionary<int, tb_datanode_model> datanodemodels, tb_partition_model p, DateTime tabletime)
 {
     long r = -1;
     SqlHelper.ExcuteSql(this.GetDataNodeConnectString(datanodemodels[info.DataNodePartition]), (c) =>
     {
         bool exsit = c.TableIsExist(fromtablename);
         if (exsit == true)
         {
             tb_messagequeue_dal dal = new tb_messagequeue_dal(); dal.TableName = fromtablename;
             long maxid = dal.GetMaxID(c); long minid = dal.GetMinID(c);
             int findcount = 0;
             while (findcount<=30)//二分查找算法,超过30次意味着算法若对,查询过一亿的数据,说明算法有问题
             {
                 findcount++;
                 KeyValuePair<long, DateTime> mininfo = dal.GetIDCreateTime(c, minid); KeyValuePair<long, DateTime> maxinfo = dal.GetIDCreateTime(c, maxid);
                 if (mininfo.Value.Date <= tabletime.Date && maxinfo.Value.Date > tabletime.Date)//最小id小于等于当天,最大id>当天,说明中间有数据要迁移
                 {
                     var midid = (long)((maxinfo.Key + mininfo.Key) / 2); KeyValuePair<long, DateTime> midinfo = dal.GetIDCreateTime(c, midid);
                     if (midinfo.Value.Date <= tabletime.Date)//往大的查找
                     {
                         minid = midid;
                     }
                     else//往小的查找
                     {
                         maxid = minid;
                     }
                     System.Threading.Thread.Sleep(50);//避免给数据库大的压力
                 }
                 else if (mininfo.Value.Date > tabletime.Date)//最小id的时间超过表当天
                 {
                     r = mininfo.Key; return;
                 }
                 else if (maxinfo.Value.Date <= tabletime.Date)//最大id的时间小于或等同当天
                 {
                     r = maxinfo.Key; return;
                 }
             }
             if (findcount >= 30)
                 throw new Exception("二分查找算法错误,查找次数超过30次");
         }
     });
     return r;
 }
Beispiel #6
0
 /// <summary>
 /// 获取分区id号隐藏的信息
 /// </summary>
 /// <param name="id"></param>
 /// <returns></returns>
 public static PartitionIDInfo GetPartitionIDInfo(int id)
 {
     PartitionIDInfo info = new PartitionIDInfo(); string example = "10101"; string strid = id.ToString();
     if(strid.Length!=example.Length)
         throw new Exception("分区Id格式不正确:"+id);
     info.DataNodePartition = Convert.ToInt32(strid.Substring(1, 2));
     info.TablePartition = Convert.ToInt32(strid.Substring(3, 2));
     return info;
 }
Beispiel #7
0
 /// <summary>
 /// 获取分区id号  分区id号,规则1+数据节点编号+表分区编号
 /// </summary>
 /// <param name="info"></param>
 /// <returns></returns>
 public static int GetPartitionID(PartitionIDInfo info)
 {
     //PartitionIDInfo info = new PartitionIDInfo();string example = "10101";string strid = id.ToString();
     string id = "1" + PartitionNameRule(info.DataNodePartition) + PartitionNameRule(info.TablePartition );
     return Convert.ToInt32(id);
 }