C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: Java 大量メール送信


(過去ログ 113 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■66622 / inTopicNo.1)  Java 大量メール送信
  
□投稿者/ ぼぼ (7回)-(2013/05/11(Sat) 23:50:32)

分類:[Java] 

こんにちは。

今、Java(mail.jar)で50万件のメールを送信しようと思っています。
ただ、単純にるーぷさせると30分で5000件程度です。

この場合、50万件を処理させようとすると、50時間かかる計算になると思います。
一応、送信エラーとなったものもログとして残さなければならず、デバッグモードでの送信です。

ちまたでは、100万件を一時間に送信させるようなサービスもありますが、
あれは、ネットワークの大域幅が広いのでしょうか?または、サーバ環境が凄いのでしょうか?

アプリ側で対応できる事と言えば、Threadで同時実行する事だと思いますが、ネットワークに掛かる負荷と
サーバ一台に掛かる負荷(CPU・メモリ)が見えず、実装におっくうになっています。

過去に大量メール送信を実装された事のある方いましたら、環境周り、アプリの構成等アドバイスいただけないでしょうか?
よろしくお願いします。
引用返信 編集キー/
■66623 / inTopicNo.2)  Re[1]: Java 大量メール送信
□投稿者/ オショウ (72回)-(2013/05/12(Sun) 12:10:20)
> 過去に大量メール送信を実装された事のある方いましたら、環境周り、アプリの構成等アドバイスいただけないでしょうか?
> よろしくお願いします。

  アドバイスも何も・・・
  そのシステムは、どこで動作させますか?
  昨今のセキュリティー体制で、大量メール発信者のインターネット
  回線を停止する・・・と言う条項がありますので、個人ではまず、
  ダメでしょう。

  企業でもレンタルサーバーの場合は、停止させられてしまうケース
  があるでしょう。

  そのシステムが悪意を持ったものではなく通常業務の元で運用され
  るものであれば・・・有償製品を購入して運用されるのが得策かと
  思いますが。

※ 因みに、自社のメールサーバーにそれだけのメールをサバキキル性
  能があるのか否か。当然、インターネット回線の帯域も影響が出ま
  す。またより上位側のプロパイダの回線契約内容にも影響されます

以上。参考まで
引用返信 編集キー/
■66625 / inTopicNo.3)  Re[2]: Java 大量メール送信
□投稿者/ ぼぼ (8回)-(2013/05/12(Sun) 14:42:22)
ありがとうございます。

もちろん、違法メール業者の存在も承知の上ですが、
一応、エンドユーザはちゃんとした企業で、そのメルマガを配信する機能です。

いくらネットワークの帯域が大きくても、サーバが一気に受け入れられなければ、
アプリ側で非同期にレスポンスを待たずに実行しても、サーバ側がパンクしてしまうでしょうし。

現在、このようにセッションを確立して投げても、30分で1万件程度です。
これにはもちろん、メールサーバ側の1日の最大送信件数、及びサーバ機性能の
条件の上だという事は承知していますが、Java側(アプリ)でパフォーマンスアップの
手法が他に無いか確認したく、思いました。

現在でも、PC6GB搭載の開発機でメモリ70%占有しておりますが、、、

よろしくお願いします。

try{
Properties props = new Properties();
props.put("mail.smtp.host", m_smtp);
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new myAuth());

MimeMessage mime = new MimeMessage(session);
InternetAddress[] addressTo = new InternetAddress[1];
InternetAddress fromAddress = new InternetAddress(m_adrs,MimeUtility.encodeWord(m_name,"iso-2022-jp","B"));
mime.setFrom(fromAddress);
mime.setHeader("Content-Transfer-Encoding","7bit");
mime.setSubject(MimeUtility.encodeText(title,"iso-2022-jp","B"));
mime.setContent(honbun,"text/plain; charset=iso-2022-jp");
mime.setSentDate(new Date());

Transport transport = session.getTransport("smtp");
transport.connect();
for (int i = 0; i < alist.size(); i++) {
String ml = alist.get(i);
try {
if (ken != 0 && i != 0 && (i % ken == 0)) {
log.info(" "+(i+1)+"件目 "+(mate / 1000)+"秒待機します");
Thread.sleep(mate);
}
// メール送信
addressTo[0] = new InternetAddress(ml);
mime.setRecipients(MimeMessage.RecipientType.TO,addressTo);
transport.send(mime,addressTo);
} catch (Exception e) {
log.error(" 送信失敗:"+ml);
}
}
transport.close();
} catch (Exception e) {
log.error("予期せぬエラー:"+e.getMessage());
e.printStackTrace();
}

引用返信 編集キー/
■66636 / inTopicNo.4)  Re[3]: Java 大量メール送信
□投稿者/ オショウ (73回)-(2013/05/13(Mon) 01:47:06)
> 現在、このようにセッションを確立して投げても、30分で1万件程度です。

  1スレッドで30分に1万件なら、10スレッドにすれば
  理路上、10万件は可能になる・・・

  ただ、既に70%メモリを消費しているとのこと。
  よって物理的には、2スレッド程度しか無理だろうと思う。

  PCを64ビットにして、さて何GBメモリを搭載すれば、
  目標の達成ができることやら。

以上。
引用返信 編集キー/
■66642 / inTopicNo.5)  Re[3]: Java 大量メール送信
□投稿者/ コンビーフ (1回)-(2013/05/13(Mon) 12:24:54)
> 一応、エンドユーザはちゃんとした企業で、そのメルマガを配信する機能です。

ここでいうエンドユーザーとは、メルマガの配信元ですか?配信先ですか?
質問の内容では、メール配信元とあなたとの関係がよく分かりませんが、いずれにしろ、メルマガの配信元がちゃんとした企業で、
あなたがその企業のメルマガ配信を請け負っているのであれば、またはあなたがメール配信元に属する人間であるならば、
50万件のメールを確実に配信できるインフラとリソースを用意すべき(またはそのようなサービスを利用すべき)で、
ショボいプログラムで済ませようと思うべきではないと思います。
これは、和尚さんも書いたように、PCのリソースを食いつくすだけではなく、プロバイダ側のリソースも大幅に占有してしまう
可能性があるためです。
引用返信 編集キー/
■66645 / inTopicNo.6)  Re[4]: Java 大量メール送信
□投稿者/ ぼぼ (9回)-(2013/05/13(Mon) 14:25:02)
ありがとうございます。

今回、メルマガ配信の依頼を受けた時に、
メールサーバへの多負荷・ネットワークの帯域幅
については、話しています。

プロバイダでメールアドレスを借りている場合は
一日の最大送信件数の制御、ネットワークの占有により警告を
受ける事もある事も。

ただ、メールは自前で用意しているようなので、
大丈夫との事です。

インフラ面については承知の上ですが、
アプリ側でのパフォーマンス向上の為の実装上の工夫を
お聞きしたかったのです。

やはり、スレッドが主要な方法になるのでしょうか。
例えば、SMTPサーバの認証不要に設定しての送信なども
方式として考えられないでしょうか?


引用返信 編集キー/
■66649 / inTopicNo.7)  Re[5]: Java 大量メール送信
□投稿者/ コンビーフ (3回)-(2013/05/13(Mon) 15:00:46)
メール送信時にはメール送信アプリの入った端末とメールサーバーとの間で(セッション確立後も)
何回もやりとりを行っていますので、端末とメールサーバーとの通信が一番のボトルネックとなるわけで、
端末側でどうにかできるような代物ではないのではないかと思います。
また、メールキューのようなバッファがサーバー側に用意されていたとしても、これがいっぱいになれば
端末側が待たされることになるでしょう。
なので、マルチスレッドにしても、複数端末の使用にしても、効果が見込めるかは分かりません。
引用返信 編集キー/
■66706 / inTopicNo.8)  Re[6]: Java 大量メール送信
□投稿者/ ぼぼ (11回)-(2013/05/17(Fri) 23:10:08)
コンビーフさん、ありがとうございます。

確認が遅れまして申し訳ありません。
このようなメールの大量送信は下記が注意点になると思うのですが。

・アプリ
 アプリサーバの端末スペック(マルチスレッドで同時実行するスレッド数で問題なく動く)
・メールサーバ
 送信結果の取得&返却(返却までの時間も含む)
 1秒間にいくつのリクエストに対応できるのかの設定&端末のスペック
・ネットワーク帯域幅
 メールサーバとアプリの通信の同時実行回数の上限が保障され、セッションも切れない環境。

この3つの要素を絡めなければ、どれかが揃わなく(パンクする)てもシステムとして成り立たないと言う事ですよね?
引用返信 編集キー/
■66708 / inTopicNo.9)  Re[7]: Java 大量メール送信
□投稿者/ 甕星 (10回)-(2013/05/18(Sat) 07:16:14)

> ・アプリ
>  アプリサーバの端末スペック(マルチスレッドで同時実行するスレッド数で問題なく動く)

メールの送信自体は、それほど負荷の高い処理ではありません。
Mail.Jarの実装が大量のメール送信を前提とした実装になっていたいために、
インスタンスの生成や破棄が繰り返される事が問題なのであって、
適切に実装しなおせばもっと軽くなるはずです。

> ・メールサーバ
>  送信結果の取得&返却(返却までの時間も含む)

通常のメールサーバーに送信結果の取得返却を行う機能はありません。
送信エラーも含めて管理したいのであれば、メールクライアントではなく、
メールサーバーとして実装する必要があるでしょう。
spam防止のために、送信元ドメインと送信元アドレスが一致しないと
spamフィルタにかかったりするので、そのあたりにも配慮が必要です。

>  1秒間にいくつのリクエストに対応できるのかの設定&端末のスペック

メールの送信自体はそれほど負荷の高いものではないので、
大域幅の問題が大きいです。送信側サーバーだけではなく、
宛先側サーバーの通信大域による制限もあります。
効率化するために同一ドメイン宛のメールをまとめて処理したりしますね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -