DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cqfighterli
今日帖子: 18
在线用户: 13
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2015/7/3 8:58:16
标题:
有人用datasnap 开发过成功稳定的Rest服务程序么? 浏览:3417
加入我的收藏
楼主: 本人最近用datasnap 开发rest服务程序为web提供rest服务,出现了稳定性的问题,在此特地开贴咨询各位高手是否有人 开发出过稳定的rest服务程序
1.本人 采用的是Xe7 update1 
2.rest服务采用的是delphi 自带的 indy组件
3.本人的水平应该还说的过去,不是特别菜的
4 通过一段时间的学习 datasnap的一些基本用法都比较熟悉了
目前存在的问题
  主要是稳定性,程序运行几天之后 就报内存错误,期间通过fastmm跟踪过基本排除自己编写代码的问题,在通过fastmm跟踪的过程中 经常会出现IdXXX 报出的内存错误.
  出现内存错误后,Rest服务就不能访问了,
----------
  在此特意咨询论坛里的高手,是否你们有用delphi 自带的datasnap 开发过成功稳定的Rest 服务或者 用http协议开发的的稳定性程序.
----------------------------------------------
-
作者:
男 zoujun3281 (无奈) ▲▲▲▲▲ -
普通会员
2015/7/3 9:51:58
1楼: 用户量不大直接写个程序 Rest挂掉就重启
----------------------------------------------
delphi你妹
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2015/7/3 10:00:28
2楼: delphi 程序总不能靠这种办法活吧!
----------------------------------------------
-
作者:
男 drroc (mvcxe) ★☆☆☆☆ -
盒子活跃会员
2015/7/3 10:24:23
3楼: datasnap一定要编译成exe吗?不能编译成isapi,apache module?
----------------------------------------------
MVCXE中国首个DELPHI MVC WEB框架:https://www.mvcxe.com/
作者:
男 robinson2006 (Leo) ★☆☆☆☆ -
普通会员
2015/7/3 10:33:50
4楼: 本人水平一般,算不得高手.有些相关的经验

1.服务端做成无连接的.取完数据.就断开链接.
2.做个测试程序,持续大量的进行压力测试,
个人认为数量上个一天500万条不崩溃,就算及格.时间上程序至少要开个三四天不出问题,才算勉强稳定. 我们自己是测试3000万条数据.一般来说.500万不出问题.3000万也不太会出问题
3.数据量太大的话,外部可以用成熟的消息队列产品,推荐RabbitMQ, 内部可以自己实现个内存队列.从队列从取信息过来.放到线程中处理..
4.线程注意锁的问题.
5.程序加个自重启功能.一段时间重启自己一次
6.如果业务逻辑无耦合, 也可以尝试一下OpenResty之类的.
7.加监控程序.程序崩溃自动打开.异常情况打电话.发信息通知.

其他的暂时还没想到...
----------------------------------------------
-
作者:
男 madwolf (林之白狼) ★☆☆☆☆ -
普通会员
2015/7/3 10:55:02
5楼: 做个标记
----------------------------------------------
delphi加油!!
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2015/7/3 13:05:57
6楼: 感谢 robinson2006 提供的方法,我会实验的.
to drroc datasnap 编译成isapi 我还真没试验过..webbroker 我倒是知道
不知道 datasnap 怎么编译成isapi 不需要 indy的支持么?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2015/7/3 13:16:18
7楼: 不是编译成 ISAPI,而是你可以新建一个 ISAPI DATASNAP 项目。
----------------------------------------------
(C)(P)Flying Wang
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2015/7/3 13:27:09
8楼: 新建 rest application 可以建 isapi项目, 我直接建的是datasnap server 好像没有
选择 isapi 的选项..
而且即使 建siapi的项目 我看里面用的DsServer 这个组件,还是需要 indy 的http服务
归根到底还是一样的啊...
----------------------------------------------
-
作者:
男 zhangpuqing (pupu) ★☆☆☆☆ -
普通会员
2015/7/3 13:46:25
9楼: 呵呵之前我也自己写了个datasnap,小应用,就一个函数。服务端接了数据库了。
连接数在10左右,但已经正常用了几个月了,从没重启过。
----------------------------------------------
-
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2015/7/3 20:45:23
10楼: C/S 的tcp 连接我之前也做过,还比较稳定,但是
http的服务是最近才正式用在项目上,稳定性让人无语啊...
正在研究 diocp 的http 替代方案....希望没问题
----------------------------------------------
-
作者:
男 marco_hsu (marco) ★☆☆☆☆ -
盒子活跃会员
2016/1/25 21:27:18
11楼: 开源出来大家改进,哈哈
----------------------------------------------
I Love Delphi
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2016/1/25 21:34:38
12楼: delphi实现的Web服务器演示:
http://122.0.72.150/

最近次升级后,又连续跑好几周了。

写个插件挂上,主服务不用动,就可以舒舒服服Rest!
此帖子包含附件:
JPEG 图像
大小:66.7K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2016/1/25 21:41:06
13楼: //
// RestDemo.dpr -- QuickBurro(JerryMouse)REST编程演示插件!
//          Version: 1.00
//          Author: Jopher(W.G.Z);
//          Copyright(C) Jopher Software Studio, 2006-2015
//
library RestDemo;

uses
  FastMM4,
  SysUtils,
  Classes,
  Windows,
  {$IFDEF UNICODE}
  AnsiStrings,
  {$ENDIF}
  QBParcel,
  QBJson,
  DllSpread,
  NodeServiceAPI;

{$R *.RES}

//
// 主函数,此函数由应用程序员编写...
function MainFunction(RequestParcel: TQBParcel; ResponseParcel: TQBParcel): boolean;
var
   InputJson,OutputJson: TQBJson;
   tmpstr: ansistring;
begin
//
// 读取传入的Json...
   if RequestParcel.GoodsExists('_Request_Body') then
      begin
         tmpstr:=RequestParcel.GetAnsiStringGoods('_Request_Body');
         try
          InputJson:=TQBJson.Create(tmpstr);
         except
          InputJson:=nil;
         end;
      end
   else
      InputJson:=nil;

//
// 这里进行业务逻辑处理...

//
// 生成REST输出...
   OutputJson:=TQBJson.Create;
   if InputJson=nil then
      begin
         OutputJson.Put('errcode',255);
         OutputJson.Put('errtext','传入的Json参数不存在或格式错!');
      end
   else
      begin
         OutputJson.Put('errcode',0);
         OutputJson.Put('errtext','成功!');
         OutputJson.Put('InputJson',InputJson);
      end;
//
// 返回Json、不进行GZIP压缩...
   ResponseParcel.PutAnsiStringGoods('ResponseBody',OutputJson.ToString3(3,3));
   ResponseParcel.PutBooleanGoods('DisableGZip',true);
   result:=true;
end;

//
// 导出函数(应用程序员不用改)...
function WebpageProcess(InParcelPtr: integer; var OutParcelPtr: integer): boolean; stdcall;
var
   aInParcel: TQBParcel;
   aOutParcel: TQBParcel;
begin
   try
      aInParcel:=TQBParcel(InParcelPtr);
   except
      result:=false;
      exit;
   end;
   aOutParcel:=TQBParcel.Create;
   Result:=MainFunction(aInParcel,aOutParcel);
   if aOutParcel.GoodsCount<=0 then
      OutParcelPtr:=0
   else
      OutParcelPtr:=Parcel2Mem(aOutParcel);
   aOutParcel.free;
end;

exports
   WebpageProcess;
   
begin
   IsMultiThread:=true;
end.

----------以下再客户端来RPC一下----------

unit main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, mbcommon,
  MBConnection, MBJson;

type
  TForm1 = class(TForm)
    MBConn: TMBConnection;
    RPC: TMobileRPC;
    StyleBook1: TStyleBook;
    Rectangle1: TRectangle;
    Rectangle2: TRectangle;
    Memo1: TMemo;
    Label1: TLabel;
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure Image1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button2Click(Sender: TObject);
begin
   if mbconn.connect then
      memo1.lines.add('连接成功,请继续测试!')
   else
      memo1.lines.add('连接失败,无法继续测试!');
end;

procedure TForm1.Button3Click(Sender: TObject);
var
   InJson,OutJson: TMBJson;
begin
   InJson:=TMBJson.create;
   InJson.put('Name','李晓明');
   InJson.put('Age',35);
   if Rpc.JsonCall('/restdemo.asq',InJson,OutJson) then
      begin
         memo1.lines.add('调用成功!OutputJson:');
         memo1.lines.add(OutJson.ToString3(3,3));
      end
   else
      memo1.lines.add('调用失败!LastError='+Rpc.lasterror);
   InJson.free;
   if assigned(OutJson) then
      FreeAndNil(OutJson);
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
   close;
end;

end.


----------以下是结果----------
.
此帖子包含附件:
PNG 图像
大小:19.5K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2016/1/25 21:42:45
14楼: 真的,简单快速、易如反掌
----------------------------------------------
樵夫的大马甲
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/1/26 9:01:26
15楼: 这个有大量可以实际使用验证的。
----------------------------------------------
风风风
作者:
男 lxh524 (lxh524) ★☆☆☆☆ -
普通会员
2016/1/28 17:33:54
16楼: 哇哇。路过,看看热闹,肯定你的写法有问题。反正我的1个月不停Datasnap服务,多没问题。
----------------------------------------------
my computer
作者:
男 ww20000309 (ww20000309) ★☆☆☆☆ -
盒子活跃会员
2016/1/29 9:33:02
17楼: 1、在服务端所有操作最好封装到一个类中。
2、在服手端建一个对象池,根据访问情况一次建好。
3、注意对象池的临界区或信号量的的锁定和管理。
4、可以多读一读咏南的博客
----------------------------------------------
相信自己,善待友人。
作者:
女 hecongzhen (令狐**) ★☆☆☆☆ -
普通会员
2016/2/26 9:04:49
18楼: 感谢各位.特别 樵夫的马六甲
你的方法我会试试的...
长时间没关注还望见谅
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2016/2/26 9:15:54
19楼: 谢谢楼上!
随意、随缘,不必在意啥!
----------------------------------------------
樵夫的大马甲
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2016/2/26 22:34:06
20楼: 请给讲讲什么 是REST....
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS