当前位置: 代码迷 >> C# >> c# socket timer 多线程 大数据量解决思路
  详细解决方案

c# socket timer 多线程 大数据量解决思路

热度:616   发布时间:2016-04-28 08:30:46.0
c# socket timer 多线程 大数据量
问题:现有一个客户端程序主要接设备上传上来的数据,大约有2000台,每天数据量在百万级,客户端组织好设备上传的数据后,通过SOCKet发送到服务器,服务器是由另一个公司来做,刚开始设备不到100台时,数据发送很稳定,每条都能给我回复,而且速度控制在每秒八条左右,现在差不多300台,每天12万左右的数据,出现三分之二不能回复的数据,这样需要下次再发送,久而久之,出现数据滞留,这些代码放在一个TIMER控件里,现在设为1个小时循环一次,实际情况,一个小时运行不好这个循环,有没有更好的方案?
主要代码如下 
            try
            {
                
                CS = new CSocket(serverSocket);

                string sql = "select lsh, swaprec  from t_collalldatatemp t where state='0' ";
                DataTable DtPos = OracleHelper.ExecuteDataTable(OracleHelper.ConnectionString, sql);
                NumPos = Convert.ToInt32(DtPos.Rows.Count);
                if (NumPos > 0)
                {
                    lvResult.Items.Insert(0, AddListViewItem("客户端", txtJMJIPAddress.Text + ":" + txtJMJPort.Text, "开始上传消费数据..."));
                    if (CS.Open(serverIp, Convert.ToInt16(port)) == "0")
                    {
                        qcount = 0;
                        for (Int32 iSWAPREC = 0; iSWAPREC < NumPos; iSWAPREC++)
                        {
                            CS.AcceptStr = null;
                            SendTotal = string.Empty;
                            SendLX = "8030";
                            SendMsg = "00000003" + GetXzDataSocket(DtPos.Rows[iSWAPREC]["swaprec"].ToString());
                            byte[] textBuffer = System.Text.Encoding.Default.GetBytes(SendMsg);
                            SendTotal = SendLX + SendMsg + CRC16(textBuffer);
                            CS.Send(SendTotal);
                            //count = 0;
                            
                            while (true)
                            {
                                Thread.Sleep(100);
                                AceeMsg = CS.AcceptStr;
                                if (AceeMsg != null)
                                {
                                    if (AceeMsg.Substring(0, 6) == "808000")
                                    {
                                        qcount++;
                                        sql = "update t_collalldatatemp set state='1' where lsh='" + DtPos.Rows[iSWAPREC]["lsh"].ToString() + "' ";
                                        OracleHelper.InsertDataSet(sql);
                                        break;
                                    }
                                   
                                }
                                break;
                               
                            }
                        }
                        sql = "Insert into t_colldatabak Select * From t_collalldatatemp where state='1'";
                        OracleHelper.InsertDataSet(sql);
                        sql = "DELETE From t_collalldatatemp where state='1'";
                        OracleHelper.InsertDataSet(sql);
                        CS.Cancel();
                        lvResult.Items.Insert(0, AddListViewItem("客户端", txtJMJIPAddress.Text + ":" + txtJMJPort.Text, " 上传数: " + Convert.ToInt32(NumPos).ToString() + "  确认数: " + Convert.ToInt32(qcount).ToString()));
                    }
                }
            }
            catch (Exception err)
            {
                lvResult.Items.Insert(0, AddListViewItem("客户端", "error", err.Message));
            }
------解决思路----------------------


高手看不懂你的代码,唯一且最大可能性就是你连100台没问题 ,那是因为没发生数据阻塞,超过了这数了。数据处理不过来,阻塞严重就出现你所的现像了。这就是你写的Socket方式有严重的问题种造成的,
------解决思路----------------------
你如何确定是你没收到回复而不是服务器压根就没发的
------解决思路----------------------
引用:
Quote: 引用:



高手看不懂你的代码,唯一且最大可能性就是你连100台没问题 ,那是因为没发生数据阻塞,超过了这数了。数据处理不过来,阻塞严重就出现你所的现像了。这就是你写的Socket方式有严重的问题种造成的,


不是我连100台,100台发给我这个过程没有问题,有问题的是 我再将这些数据 发给你服务端,100台,只是一个量级的问题。


乱了。那你这个端到底是啥 

100台客户端-》发给你这台机器后,你再转发—》服务端??、

------解决思路----------------------
引用:
我这个端主要就是把设备发上来的数据,再重新组织,按条发送给服务端,相对于设备来说,我是服务端,相对于总集成系统我是客户端,我相对于中转站。现在的问题是每天100万条数据,这100万条数据放在一个表里,要发给集成商,原来的方法肯定不行了,用线程并发来做,这块不熟悉,有没有好的建议,最好有示例,没有分了,就不另发贴了

你作为中转站只要做好中转站的事,每天100万数据发出并回收结果是你的责任,所以你需要弄清楚到底是你没发,还是对面没回。如果你逐条发服务器都无法响应,那你多线程更加别指望了
------解决思路----------------------
由 
刚开始设备不到100台时,数据发送很稳定,每条都能给我回复,而且速度控制在每秒八条左右,现在差不多300台,每天12万左右的数据,出现三分之二不能回复的数据
可知,你的吞吐量只能是 100 台设备

你得先确定瓶颈在哪里?是终端到你,还是你到服务器
可尝试增加网卡(或串口)运行第二套程序,或加一台机器运行第二套程序
如果问题得到缓解,则说明瓶颈在 终端到你。否则说明瓶颈在 你到服务器

找到瓶颈后,在去寻找解决的办法
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:



高手看不懂你的代码,唯一且最大可能性就是你连100台没问题 ,那是因为没发生数据阻塞,超过了这数了。数据处理不过来,阻塞严重就出现你所的现像了。这就是你写的Socket方式有严重的问题种造成的,


不是我连100台,100台发给我这个过程没有问题,有问题的是 我再将这些数据 发给你服务端,100台,只是一个量级的问题。


乱了。那你这个端到底是啥 

100台客户端-》发给你这台机器后,你再转发—》服务端??、
  我这个端主要就是把设备发上来的数据,再重新组织,按条发送给服务端,相对于设备来说,我是服务端,相对于总集成系统我是客户端,我相对于中转站。现在的问题是每天100万条数据,这100万条数据放在一个表里,要发给集成商,原来的方法肯定不行了,用线程并发来做,这块不熟悉,有没有好的建议,最好有示例,没有分了,就不另发贴了


那关建就是你这100万数据发给集成商,然后集成商那边接不到数据,丢了3分2?
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:



高手看不懂你的代码,唯一且最大可能性就是你连100台没问题 ,那是因为没发生数据阻塞,超过了这数了。数据处理不过来,阻塞严重就出现你所的现像了。这就是你写的Socket方式有严重的问题种造成的,


不是我连100台,100台发给我这个过程没有问题,有问题的是 我再将这些数据 发给你服务端,100台,只是一个量级的问题。


乱了。那你这个端到底是啥 

100台客户端-》发给你这台机器后,你再转发—》服务端??、
  我这个端主要就是把设备发上来的数据,再重新组织,按条发送给服务端,相对于设备来说,我是服务端,相对于总集成系统我是客户端,我相对于中转站。现在的问题是每天100万条数据,这100万条数据放在一个表里,要发给集成商,原来的方法肯定不行了,用线程并发来做,这块不熟悉,有没有好的建议,最好有示例,没有分了,就不另发贴了


那关建就是你这100万数据发给集成商,然后集成商那边接不到数据,丢了3分2?


只能说有三分之二,我在规定时间没有收到回复而已,下一次还会重发没有给回复的数据,现在求多线程并发的例子,具体思路是,数据库里现有13万条数据,我根据上传时间中的分来区划可以分为(0,1,2,3,4,5)六段数据,每段两万多条,用六个线程进行同时发送,每个线程提高超时时间,等到回复再发下一条,服务端也支持多线程,求线程同步例子


没收到回复那不是你这边的问题呀,是集成商那边整的处理他来不及返应呗。。。

------解决思路----------------------
运行第二套程序要比你寻找 并发处理的例子 要实惠的多
你连瓶颈在哪里都不清楚就去找解决方案,显然是不能解决问题的
并发、多线程都是在资源有富余的情况下的手段(提高利用率),如果已经满负荷运转了,那就没有插针的缝了

如果服务器只能达到 每秒八条 的处理速度,你再怎么并发也是枉然
------解决思路----------------------
引用:
这是与服务端商量后得出的测试方案,两端都开多线并发处理,客户端增加超时时间,现在有没有并发处理的例子可以提供一下,时间紧迫,各位大侠

首先你同时得创建多个socket连接,然后你数据库得改成分块处理处理,不然全是重复提交。最后说句在你这项目了,多线程其实就是开了N个逐条而已,服务器单个逐条都没法回,多个只会错的更多。
------解决思路----------------------
引用:
数据库分块处理方案我已想好,设备数据上存入数据库时有一个时间,我按分来区别,可以分成012345,六段。没有真正意义上的并发吗,有没有例子啊

你所做的事就和浏览器打开网页差不多,用多个连接同时取文件,但对同一个文件来说是不能被拆开获取的。这也是多线程。但实际上就是请求*N
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:



高手看不懂你的代码,唯一且最大可能性就是你连100台没问题 ,那是因为没发生数据阻塞,超过了这数了。数据处理不过来,阻塞严重就出现你所的现像了。这就是你写的Socket方式有严重的问题种造成的,



不是我连100台,100台发给我这个过程没有问题,有问题的是 我再将这些数据 发给你服务端,100台,只是一个量级的问题。


乱了。那你这个端到底是啥 

100台客户端-》发给你这台机器后,你再转发—》服务端??、
  我这个端主要就是把设备发上来的数据,再重新组织,按条发送给服务端,相对于设备来说,我是服务端,相对于总集成系统我是客户端,我相对于中转站。现在的问题是每天100万条数据,这100万条数据放在一个表里,要发给集成商,原来的方法肯定不行了,用线程并发来做,这块不熟悉,有没有好的建议,最好有示例,没有分了,就不另发贴了


那关建就是你这100万数据发给集成商,然后集成商那边接不到数据,丢了3分2?


只能说有三分之二,我在规定时间没有收到回复而已,下一次还会重发没有给回复的数据,现在求多线程并发的例子,具体思路是,数据库里现有13万条数据,我根据上传时间中的分来区划可以分为(0,1,2,3,4,5)六段数据,每段两万多条,用六个线程进行同时发送,每个线程提高超时时间,等到回复再发下一条,服务端也支持多线程,求线程同步例子


没收到回复那不是你这边的问题呀,是集成商那边整的处理他来不及返应呗。。。


哎,真是。。。。。。,所以我要延长超时时间嘛,然后再加个多线程嘛,这样每个线程就可以平均处理了嘛,现在我问的是多线程并发啊,至于哪边的问题,测试完了才知道


你再加N 个线程也没用。你的发给集成商的口只有一个,好比你只有一个小水管与集成商那边对接,你现在想在你的这头多加几个水泵来加快平均处理时间。。。
你要么加大水管,要么多接几根水管
------解决思路----------------------
不能开第二个程序,因为端口是固定唯一的 ???
难道不可调?看你程序写的......
要是端口被其他程序占用了呢?
端口是和 ip 绑定的,不同的 ip 就可使用同一端口号

即便如此,在另一他机器上运行总是可以了的吧?
------解决思路----------------------
http://youbbe.xyz/issue/2251929/starting-timer-problem-from-asynchronous-server-socket
------解决思路----------------------
使用两个中继站测试最上游服务器,用增量测试,每次递增,前提保障你的中继站完好
  相关解决方案